In [1]:
import os
import pandas as pd
import numpy as np
import sklearn
import matplotlib.pyplot as plt
import seaborn as sns
import plotly.graph_objects as go
from IPython import display
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import LabelEncoder, MinMaxScaler

from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report, accuracy_score, confusion_matrix
from sklearn.ensemble import RandomForestClassifier

from scipy.stats import f_oneway
from scipy.stats import chi2_contingency
import warnings
warnings.simplefilter(action="ignore", category=FutureWarning)
In [2]:
pd.set_option('display.max_columns', 12)
pd.set_option('display.max_rows', 1000)

Loading training data from the CSV¶

In [3]:
#Importing the dataset
dataset = pd.read_csv('heart.csv')
df = pd.DataFrame(dataset)
df
Out[3]:
Age Sex ChestPainType RestingBP Cholesterol FastingBS RestingECG MaxHR ExerciseAngina Oldpeak ST_Slope HeartDisease
0 40 M ATA 140 289 0 Normal 172 N 0.0 Up 0
1 49 F NAP 160 180 0 Normal 156 N 1.0 Flat 1
2 37 M ATA 130 283 0 ST 98 N 0.0 Up 0
3 48 F ASY 138 214 0 Normal 108 Y 1.5 Flat 1
4 54 M NAP 150 195 0 Normal 122 N 0.0 Up 0
5 39 M NAP 120 339 0 Normal 170 N 0.0 Up 0
6 45 F ATA 130 237 0 Normal 170 N 0.0 Up 0
7 54 M ATA 110 208 0 Normal 142 N 0.0 Up 0
8 37 M ASY 140 207 0 Normal 130 Y 1.5 Flat 1
9 48 F ATA 120 284 0 Normal 120 N 0.0 Up 0
10 37 F NAP 130 211 0 Normal 142 N 0.0 Up 0
11 58 M ATA 136 164 0 ST 99 Y 2.0 Flat 1
12 39 M ATA 120 204 0 Normal 145 N 0.0 Up 0
13 49 M ASY 140 234 0 Normal 140 Y 1.0 Flat 1
14 42 F NAP 115 211 0 ST 137 N 0.0 Up 0
15 54 F ATA 120 273 0 Normal 150 N 1.5 Flat 0
16 38 M ASY 110 196 0 Normal 166 N 0.0 Flat 1
17 43 F ATA 120 201 0 Normal 165 N 0.0 Up 0
18 60 M ASY 100 248 0 Normal 125 N 1.0 Flat 1
19 36 M ATA 120 267 0 Normal 160 N 3.0 Flat 1
20 43 F TA 100 223 0 Normal 142 N 0.0 Up 0
21 44 M ATA 120 184 0 Normal 142 N 1.0 Flat 0
22 49 F ATA 124 201 0 Normal 164 N 0.0 Up 0
23 44 M ATA 150 288 0 Normal 150 Y 3.0 Flat 1
24 40 M NAP 130 215 0 Normal 138 N 0.0 Up 0
25 36 M NAP 130 209 0 Normal 178 N 0.0 Up 0
26 53 M ASY 124 260 0 ST 112 Y 3.0 Flat 0
27 52 M ATA 120 284 0 Normal 118 N 0.0 Up 0
28 53 F ATA 113 468 0 Normal 127 N 0.0 Up 0
29 51 M ATA 125 188 0 Normal 145 N 0.0 Up 0
30 53 M NAP 145 518 0 Normal 130 N 0.0 Flat 1
31 56 M NAP 130 167 0 Normal 114 N 0.0 Up 0
32 54 M ASY 125 224 0 Normal 122 N 2.0 Flat 1
33 41 M ASY 130 172 0 ST 130 N 2.0 Flat 1
34 43 F ATA 150 186 0 Normal 154 N 0.0 Up 0
35 32 M ATA 125 254 0 Normal 155 N 0.0 Up 0
36 65 M ASY 140 306 1 Normal 87 Y 1.5 Flat 1
37 41 F ATA 110 250 0 ST 142 N 0.0 Up 0
38 48 F ATA 120 177 1 ST 148 N 0.0 Up 0
39 48 F ASY 150 227 0 Normal 130 Y 1.0 Flat 0
40 54 F ATA 150 230 0 Normal 130 N 0.0 Up 0
41 54 F NAP 130 294 0 ST 100 Y 0.0 Flat 1
42 35 M ATA 150 264 0 Normal 168 N 0.0 Up 0
43 52 M NAP 140 259 0 ST 170 N 0.0 Up 0
44 43 M ASY 120 175 0 Normal 120 Y 1.0 Flat 1
45 59 M NAP 130 318 0 Normal 120 Y 1.0 Flat 0
46 37 M ASY 120 223 0 Normal 168 N 0.0 Up 0
47 50 M ATA 140 216 0 Normal 170 N 0.0 Up 0
48 36 M NAP 112 340 0 Normal 184 N 1.0 Flat 0
49 41 M ASY 110 289 0 Normal 170 N 0.0 Flat 1
50 50 M ASY 130 233 0 Normal 121 Y 2.0 Flat 1
51 47 F ASY 120 205 0 Normal 98 Y 2.0 Flat 1
52 45 M ATA 140 224 1 Normal 122 N 0.0 Up 0
53 41 F ATA 130 245 0 Normal 150 N 0.0 Up 0
54 52 F ASY 130 180 0 Normal 140 Y 1.5 Flat 0
55 51 F ATA 160 194 0 Normal 170 N 0.0 Up 0
56 31 M ASY 120 270 0 Normal 153 Y 1.5 Flat 1
57 58 M NAP 130 213 0 ST 140 N 0.0 Flat 1
58 54 M ASY 150 365 0 ST 134 N 1.0 Up 0
59 52 M ASY 112 342 0 ST 96 Y 1.0 Flat 1
60 49 M ATA 100 253 0 Normal 174 N 0.0 Up 0
61 43 F NAP 150 254 0 Normal 175 N 0.0 Up 0
62 45 M ASY 140 224 0 Normal 144 N 0.0 Up 0
63 46 M ASY 120 277 0 Normal 125 Y 1.0 Flat 1
64 50 F ATA 110 202 0 Normal 145 N 0.0 Up 0
65 37 F ATA 120 260 0 Normal 130 N 0.0 Up 0
66 45 F ASY 132 297 0 Normal 144 N 0.0 Up 0
67 32 M ATA 110 225 0 Normal 184 N 0.0 Up 0
68 52 M ASY 160 246 0 ST 82 Y 4.0 Flat 1
69 44 M ASY 150 412 0 Normal 170 N 0.0 Up 0
70 57 M ATA 140 265 0 ST 145 Y 1.0 Flat 1
71 44 M ATA 130 215 0 Normal 135 N 0.0 Up 0
72 52 M ASY 120 182 0 Normal 150 N 0.0 Flat 1
73 44 F ASY 120 218 0 ST 115 N 0.0 Up 0
74 55 M ASY 140 268 0 Normal 128 Y 1.5 Flat 1
75 46 M NAP 150 163 0 Normal 116 N 0.0 Up 0
76 32 M ASY 118 529 0 Normal 130 N 0.0 Flat 1
77 35 F ASY 140 167 0 Normal 150 N 0.0 Up 0
78 52 M ATA 140 100 0 Normal 138 Y 0.0 Up 0
79 49 M ASY 130 206 0 Normal 170 N 0.0 Flat 1
80 55 M NAP 110 277 0 Normal 160 N 0.0 Up 0
81 54 M ATA 120 238 0 Normal 154 N 0.0 Up 0
82 63 M ASY 150 223 0 Normal 115 N 0.0 Flat 1
83 52 M ATA 160 196 0 Normal 165 N 0.0 Up 0
84 56 M ASY 150 213 1 Normal 125 Y 1.0 Flat 1
85 66 M ASY 140 139 0 Normal 94 Y 1.0 Flat 1
86 65 M ASY 170 263 1 Normal 112 Y 2.0 Flat 1
87 53 F ATA 140 216 0 Normal 142 Y 2.0 Flat 0
88 43 M TA 120 291 0 ST 155 N 0.0 Flat 1
89 55 M ASY 140 229 0 Normal 110 Y 0.5 Flat 0
90 49 F ATA 110 208 0 Normal 160 N 0.0 Up 0
91 39 M ASY 130 307 0 Normal 140 N 0.0 Up 0
92 52 F ATA 120 210 0 Normal 148 N 0.0 Up 0
93 48 M ASY 160 329 0 Normal 92 Y 1.5 Flat 1
94 39 F NAP 110 182 0 ST 180 N 0.0 Up 0
95 58 M ASY 130 263 0 Normal 140 Y 2.0 Flat 1
96 43 M ATA 142 207 0 Normal 138 N 0.0 Up 0
97 39 M NAP 160 147 1 Normal 160 N 0.0 Up 0
98 56 M ASY 120 85 0 Normal 140 N 0.0 Up 0
99 41 M ATA 125 269 0 Normal 144 N 0.0 Up 0
100 65 M ASY 130 275 0 ST 115 Y 1.0 Flat 1
101 51 M ASY 130 179 0 Normal 100 N 0.0 Up 0
102 40 F ASY 150 392 0 Normal 130 N 2.0 Flat 1
103 40 M ASY 120 466 1 Normal 152 Y 1.0 Flat 1
104 46 M ASY 118 186 0 Normal 124 N 0.0 Flat 1
105 57 M ATA 140 260 1 Normal 140 N 0.0 Up 0
106 48 F ASY 120 254 0 ST 110 N 0.0 Up 0
107 34 M ATA 150 214 0 ST 168 N 0.0 Up 0
108 50 M ASY 140 129 0 Normal 135 N 0.0 Up 0
109 39 M ATA 190 241 0 Normal 106 N 0.0 Up 0
110 59 F ATA 130 188 0 Normal 124 N 1.0 Flat 0
111 57 M ASY 150 255 0 Normal 92 Y 3.0 Flat 1
112 47 M ASY 140 276 1 Normal 125 Y 0.0 Up 0
113 38 M ATA 140 297 0 Normal 150 N 0.0 Up 0
114 49 F NAP 130 207 0 ST 135 N 0.0 Up 0
115 33 F ASY 100 246 0 Normal 150 Y 1.0 Flat 1
116 38 M ASY 120 282 0 Normal 170 N 0.0 Flat 1
117 59 F ASY 130 338 1 ST 130 Y 1.5 Flat 1
118 35 F TA 120 160 0 ST 185 N 0.0 Up 0
119 34 M TA 140 156 0 Normal 180 N 0.0 Flat 1
120 47 F NAP 135 248 1 Normal 170 N 0.0 Flat 1
121 52 F NAP 125 272 0 Normal 139 N 0.0 Up 0
122 46 M ASY 110 240 0 ST 140 N 0.0 Up 0
123 58 F ATA 180 393 0 Normal 110 Y 1.0 Flat 1
124 58 M ATA 130 230 0 Normal 150 N 0.0 Up 0
125 54 M ATA 120 246 0 Normal 110 N 0.0 Up 0
126 34 F ATA 130 161 0 Normal 190 N 0.0 Up 0
127 48 F ASY 108 163 0 Normal 175 N 2.0 Up 0
128 54 F ATA 120 230 1 Normal 140 N 0.0 Up 0
129 42 M NAP 120 228 0 Normal 152 Y 1.5 Flat 0
130 38 M NAP 145 292 0 Normal 130 N 0.0 Up 0
131 46 M ASY 110 202 0 Normal 150 Y 0.0 Flat 1
132 56 M ASY 170 388 0 ST 122 Y 2.0 Flat 1
133 56 M ASY 150 230 0 ST 124 Y 1.5 Flat 1
134 61 F ASY 130 294 0 ST 120 Y 1.0 Flat 0
135 49 M NAP 115 265 0 Normal 175 N 0.0 Flat 1
136 43 F ATA 120 215 0 ST 175 N 0.0 Up 0
137 39 M ATA 120 241 0 ST 146 N 2.0 Up 0
138 54 M ASY 140 166 0 Normal 118 Y 0.0 Flat 1
139 43 M ASY 150 247 0 Normal 130 Y 2.0 Flat 1
140 52 M ASY 160 331 0 Normal 94 Y 2.5 Flat 1
141 50 M ASY 140 341 0 ST 125 Y 2.5 Flat 1
142 47 M ASY 160 291 0 ST 158 Y 3.0 Flat 1
143 53 M ASY 140 243 0 Normal 155 N 0.0 Up 0
144 56 F ATA 120 279 0 Normal 150 N 1.0 Flat 1
145 39 M ASY 110 273 0 Normal 132 N 0.0 Up 0
146 42 M ATA 120 198 0 Normal 155 N 0.0 Up 0
147 43 F ATA 120 249 0 ST 176 N 0.0 Up 0
148 50 M ATA 120 168 0 Normal 160 N 0.0 Up 0
149 54 M ASY 130 603 1 Normal 125 Y 1.0 Flat 1
150 39 M ATA 130 215 0 Normal 120 N 0.0 Up 0
151 48 M ATA 100 159 0 Normal 100 N 0.0 Up 0
152 40 M ATA 130 275 0 Normal 150 N 0.0 Up 0
153 55 M ASY 120 270 0 Normal 140 N 0.0 Up 0
154 41 M ATA 120 291 0 ST 160 N 0.0 Up 0
155 56 M ASY 155 342 1 Normal 150 Y 3.0 Flat 1
156 38 M ASY 110 190 0 Normal 150 Y 1.0 Flat 1
157 49 M ASY 140 185 0 Normal 130 N 0.0 Up 0
158 44 M ASY 130 290 0 Normal 100 Y 2.0 Flat 1
159 54 M ATA 160 195 0 ST 130 N 1.0 Up 0
160 59 M ASY 140 264 1 LVH 119 Y 0.0 Flat 1
161 49 M ASY 128 212 0 Normal 96 Y 0.0 Flat 1
162 47 M ATA 160 263 0 Normal 174 N 0.0 Up 0
163 42 M ATA 120 196 0 Normal 150 N 0.0 Up 0
164 52 F ATA 140 225 0 Normal 140 N 0.0 Up 0
165 46 M TA 140 272 1 Normal 175 N 2.0 Flat 1
166 50 M ASY 140 231 0 ST 140 Y 5.0 Flat 1
167 48 M ATA 140 238 0 Normal 118 N 0.0 Up 0
168 58 M ASY 135 222 0 Normal 100 N 0.0 Up 0
169 58 M NAP 140 179 0 Normal 160 N 0.0 Up 0
170 29 M ATA 120 243 0 Normal 160 N 0.0 Up 0
171 40 M NAP 140 235 0 Normal 188 N 0.0 Up 0
172 53 M ATA 140 320 0 Normal 162 N 0.0 Up 0
173 49 M NAP 140 187 0 Normal 172 N 0.0 Up 0
174 52 M ASY 140 266 0 Normal 134 Y 2.0 Flat 1
175 43 M ASY 140 288 0 Normal 135 Y 2.0 Flat 1
176 54 M ASY 140 216 0 Normal 105 N 1.5 Flat 1
177 59 M ATA 140 287 0 Normal 150 N 0.0 Up 0
178 37 M NAP 130 194 0 Normal 150 N 0.0 Up 0
179 46 F ASY 130 238 0 Normal 90 N 0.0 Up 0
180 52 M ASY 130 225 0 Normal 120 Y 2.0 Flat 1
181 51 M ATA 130 224 0 Normal 150 N 0.0 Up 0
182 52 M ASY 140 404 0 Normal 124 Y 2.0 Flat 1
183 46 M ASY 110 238 0 ST 140 Y 1.0 Flat 0
184 54 F ATA 160 312 0 Normal 130 N 0.0 Up 0
185 58 M NAP 160 211 1 ST 92 N 0.0 Flat 1
186 58 M ATA 130 251 0 Normal 110 N 0.0 Up 0
187 41 M ASY 120 237 1 Normal 138 Y 1.0 Flat 1
188 50 F ASY 120 328 0 Normal 110 Y 1.0 Flat 0
189 53 M ASY 180 285 0 ST 120 Y 1.5 Flat 1
190 46 M ASY 180 280 0 ST 120 N 0.0 Up 0
191 50 M ATA 170 209 0 ST 116 N 0.0 Up 0
192 48 M ATA 130 245 0 Normal 160 N 0.0 Up 0
193 45 M NAP 135 192 0 Normal 110 N 0.0 Up 0
194 41 F ATA 125 184 0 Normal 180 N 0.0 Up 0
195 62 F TA 160 193 0 Normal 116 N 0.0 Up 0
196 49 M ASY 120 297 0 Normal 132 N 1.0 Flat 0
197 42 M ATA 150 268 0 Normal 136 N 0.0 Up 0
198 53 M ASY 120 246 0 Normal 116 Y 0.0 Flat 1
199 57 F TA 130 308 0 Normal 98 N 1.0 Flat 0
200 47 M TA 110 249 0 Normal 150 N 0.0 Up 0
201 46 M NAP 120 230 0 Normal 150 N 0.0 Up 0
202 42 M NAP 160 147 0 Normal 146 N 0.0 Up 0
203 31 F ATA 100 219 0 ST 150 N 0.0 Up 0
204 56 M ATA 130 184 0 Normal 100 N 0.0 Up 0
205 50 M ASY 150 215 0 Normal 140 Y 0.0 Up 0
206 35 M ATA 120 308 0 LVH 180 N 0.0 Up 0
207 35 M ATA 110 257 0 Normal 140 N 0.0 Flat 1
208 28 M ATA 130 132 0 LVH 185 N 0.0 Up 0
209 54 M ASY 125 216 0 Normal 140 N 0.0 Flat 1
210 48 M ASY 106 263 1 Normal 110 N 0.0 Flat 1
211 50 F NAP 140 288 0 Normal 140 Y 0.0 Flat 1
212 56 M NAP 130 276 0 Normal 128 Y 1.0 Up 0
213 56 F NAP 130 219 0 ST 164 N 0.0 Up 0
214 47 M ASY 150 226 0 Normal 98 Y 1.5 Flat 1
215 30 F TA 170 237 0 ST 170 N 0.0 Up 0
216 39 M ASY 110 280 0 Normal 150 N 0.0 Flat 1
217 54 M NAP 120 217 0 Normal 137 N 0.0 Up 0
218 55 M ATA 140 196 0 Normal 150 N 0.0 Up 0
219 29 M ATA 140 263 0 Normal 170 N 0.0 Up 0
220 46 M ASY 130 222 0 Normal 112 N 0.0 Flat 1
221 51 F ASY 160 303 0 Normal 150 Y 1.0 Flat 1
222 48 F NAP 120 195 0 Normal 125 N 0.0 Up 0
223 33 M NAP 120 298 0 Normal 185 N 0.0 Up 0
224 55 M ATA 120 256 1 Normal 137 N 0.0 Up 0
225 50 M ASY 145 264 0 Normal 150 N 0.0 Flat 1
226 53 M NAP 120 195 0 Normal 140 N 0.0 Up 0
227 38 M ASY 92 117 0 Normal 134 Y 2.5 Flat 1
228 41 M ATA 120 295 0 Normal 170 N 0.0 Up 0
229 37 F ASY 130 173 0 ST 184 N 0.0 Up 0
230 37 M ASY 130 315 0 Normal 158 N 0.0 Up 0
231 40 M NAP 130 281 0 Normal 167 N 0.0 Up 0
232 38 F ATA 120 275 0 Normal 129 N 0.0 Up 0
233 41 M ASY 112 250 0 Normal 142 N 0.0 Up 0
234 54 F ATA 140 309 0 ST 140 N 0.0 Up 0
235 39 M ATA 120 200 0 Normal 160 Y 1.0 Flat 0
236 41 M ASY 120 336 0 Normal 118 Y 3.0 Flat 1
237 55 M TA 140 295 0 Normal 136 N 0.0 Flat 1
238 48 M ASY 160 355 0 Normal 99 Y 2.0 Flat 1
239 48 M ASY 160 193 0 Normal 102 Y 3.0 Flat 1
240 55 M ATA 145 326 0 Normal 155 N 0.0 Up 0
241 54 M ASY 200 198 0 Normal 142 Y 2.0 Flat 1
242 55 M ATA 160 292 1 Normal 143 Y 2.0 Flat 1
243 43 F ATA 120 266 0 Normal 118 N 0.0 Up 0
244 48 M ASY 160 268 0 Normal 103 Y 1.0 Flat 1
245 54 M TA 120 171 0 Normal 137 N 2.0 Up 0
246 54 M NAP 120 237 0 Normal 150 Y 1.5 Flat 1
247 48 M ASY 122 275 1 ST 150 Y 2.0 Down 1
248 45 M ASY 130 219 0 ST 130 Y 1.0 Flat 1
249 49 M ASY 130 341 0 Normal 120 Y 1.0 Flat 1
250 44 M ASY 135 491 0 Normal 135 N 0.0 Flat 1
251 48 M ASY 120 260 0 Normal 115 N 2.0 Flat 1
252 61 M ASY 125 292 0 ST 115 Y 0.0 Up 0
253 62 M ATA 140 271 0 Normal 152 N 1.0 Up 0
254 55 M ASY 145 248 0 Normal 96 Y 2.0 Flat 1
255 53 F NAP 120 274 0 Normal 130 N 0.0 Up 0
256 55 F ATA 130 394 0 LVH 150 N 0.0 Up 0
257 36 M NAP 150 160 0 Normal 172 N 0.0 Up 0
258 51 F NAP 150 200 0 Normal 120 N 0.5 Up 0
259 55 F ATA 122 320 0 Normal 155 N 0.0 Up 0
260 46 M ATA 140 275 0 Normal 165 Y 0.0 Up 0
261 54 F ATA 120 221 0 Normal 138 N 1.0 Up 0
262 46 M ASY 120 231 0 Normal 115 Y 0.0 Flat 1
263 59 M ASY 130 126 0 Normal 125 N 0.0 Flat 1
264 47 M NAP 140 193 0 Normal 145 Y 1.0 Flat 1
265 54 M ATA 160 305 0 Normal 175 N 0.0 Up 0
266 52 M ASY 130 298 0 Normal 110 Y 1.0 Flat 1
267 34 M ATA 98 220 0 Normal 150 N 0.0 Up 0
268 54 M ASY 130 242 0 Normal 91 Y 1.0 Flat 1
269 47 F NAP 130 235 0 Normal 145 N 2.0 Flat 0
270 45 M ASY 120 225 0 Normal 140 N 0.0 Up 0
271 32 F ATA 105 198 0 Normal 165 N 0.0 Up 0
272 55 M ASY 140 201 0 Normal 130 Y 3.0 Flat 1
273 55 M NAP 120 220 0 LVH 134 N 0.0 Up 0
274 45 F ATA 180 295 0 Normal 180 N 0.0 Up 0
275 59 M NAP 180 213 0 Normal 100 N 0.0 Up 0
276 51 M NAP 135 160 0 Normal 150 N 2.0 Flat 1
277 52 M ASY 170 223 0 Normal 126 Y 1.5 Flat 1
278 57 F ASY 180 347 0 ST 126 Y 0.8 Flat 0
279 54 F ATA 130 253 0 ST 155 N 0.0 Up 0
280 60 M NAP 120 246 0 LVH 135 N 0.0 Up 0
281 49 M ASY 150 222 0 Normal 122 N 2.0 Flat 1
282 51 F NAP 130 220 0 Normal 160 Y 2.0 Up 0
283 55 F ATA 110 344 0 ST 160 N 0.0 Up 0
284 42 M ASY 140 358 0 Normal 170 N 0.0 Up 0
285 51 F NAP 110 190 0 Normal 120 N 0.0 Up 0
286 59 M ASY 140 169 0 Normal 140 N 0.0 Up 0
287 53 M ATA 120 181 0 Normal 132 N 0.0 Up 0
288 48 F ATA 133 308 0 ST 156 N 2.0 Up 0
289 36 M ATA 120 166 0 Normal 180 N 0.0 Up 0
290 48 M NAP 110 211 0 Normal 138 N 0.0 Up 0
291 47 F ATA 140 257 0 Normal 135 N 1.0 Up 0
292 53 M ASY 130 182 0 Normal 148 N 0.0 Up 0
293 65 M ASY 115 0 0 Normal 93 Y 0.0 Flat 1
294 32 M TA 95 0 1 Normal 127 N 0.7 Up 1
295 61 M ASY 105 0 1 Normal 110 Y 1.5 Up 1
296 50 M ASY 145 0 1 Normal 139 Y 0.7 Flat 1
297 57 M ASY 110 0 1 ST 131 Y 1.4 Up 1
298 51 M ASY 110 0 1 Normal 92 N 0.0 Flat 1
299 47 M ASY 110 0 1 ST 149 N 2.1 Up 1
300 60 M ASY 160 0 1 Normal 149 N 0.4 Flat 1
301 55 M ATA 140 0 0 ST 150 N 0.2 Up 0
302 53 M ASY 125 0 1 Normal 120 N 1.5 Up 1
303 62 F ASY 120 0 1 ST 123 Y 1.7 Down 1
304 51 M ASY 95 0 1 Normal 126 N 2.2 Flat 1
305 51 F ASY 120 0 1 Normal 127 Y 1.5 Up 1
306 55 M ASY 115 0 1 Normal 155 N 0.1 Flat 1
307 53 M ATA 130 0 0 ST 120 N 0.7 Down 0
308 58 M ASY 115 0 1 Normal 138 N 0.5 Up 1
309 57 M ASY 95 0 1 Normal 182 N 0.7 Down 1
310 65 M ASY 155 0 0 Normal 154 N 1.0 Up 0
311 60 M ASY 125 0 1 Normal 110 N 0.1 Up 1
312 41 M ASY 125 0 1 Normal 176 N 1.6 Up 1
313 34 M ASY 115 0 1 Normal 154 N 0.2 Up 1
314 53 M ASY 80 0 0 Normal 141 Y 2.0 Down 0
315 74 M ATA 145 0 1 ST 123 N 1.3 Up 1
316 57 M NAP 105 0 1 Normal 148 N 0.3 Flat 1
317 56 M ASY 140 0 1 Normal 121 Y 1.8 Up 1
318 61 M ASY 130 0 1 Normal 77 N 2.5 Flat 1
319 68 M ASY 145 0 1 Normal 136 N 1.8 Up 1
320 59 M NAP 125 0 1 Normal 175 N 2.6 Flat 1
321 63 M ASY 100 0 1 Normal 109 N -0.9 Flat 1
322 38 F ASY 105 0 1 Normal 166 N 2.8 Up 1
323 62 M ASY 115 0 1 Normal 128 Y 2.5 Down 1
324 46 M ASY 100 0 1 ST 133 N -2.6 Flat 1
325 42 M ASY 105 0 1 Normal 128 Y -1.5 Down 1
326 45 M NAP 110 0 0 Normal 138 N -0.1 Up 0
327 59 M ASY 125 0 1 Normal 119 Y 0.9 Up 1
328 52 M ASY 95 0 1 Normal 82 Y 0.8 Flat 1
329 60 M ASY 130 0 1 ST 130 Y 1.1 Down 1
330 60 M NAP 115 0 1 Normal 143 N 2.4 Up 1
331 56 M ASY 115 0 1 ST 82 N -1.0 Up 1
332 38 M NAP 100 0 0 Normal 179 N -1.1 Up 0
333 40 M ASY 95 0 1 ST 144 N 0.0 Up 1
334 51 M ASY 130 0 1 Normal 170 N -0.7 Up 1
335 62 M TA 120 0 1 LVH 134 N -0.8 Flat 1
336 72 M NAP 160 0 0 LVH 114 N 1.6 Flat 0
337 63 M ASY 150 0 1 ST 154 N 3.7 Up 1
338 63 M ASY 140 0 1 LVH 149 N 2.0 Up 1
339 64 F ASY 95 0 1 Normal 145 N 1.1 Down 1
340 43 M ASY 100 0 1 Normal 122 N 1.5 Down 1
341 64 M ASY 110 0 1 Normal 114 Y 1.3 Down 1
342 61 M ASY 110 0 1 Normal 113 N 1.4 Flat 1
343 52 M ASY 130 0 1 Normal 120 N 0.0 Flat 1
344 51 M ASY 120 0 1 Normal 104 N 0.0 Flat 1
345 69 M ASY 135 0 0 Normal 130 N 0.0 Flat 1
346 59 M ASY 120 0 0 Normal 115 N 0.0 Flat 1
347 48 M ASY 115 0 1 Normal 128 N 0.0 Flat 1
348 69 M ASY 137 0 0 ST 104 Y 1.6 Flat 1
349 36 M ASY 110 0 1 Normal 125 Y 1.0 Flat 1
350 53 M ASY 120 0 1 Normal 120 N 0.0 Flat 1
351 43 M ASY 140 0 0 ST 140 Y 0.5 Up 1
352 56 M ASY 120 0 0 ST 100 Y -1.0 Down 1
353 58 M ASY 130 0 0 ST 100 Y 1.0 Flat 1
354 55 M ASY 120 0 0 ST 92 N 0.3 Up 1
355 67 M TA 145 0 0 LVH 125 N 0.0 Flat 1
356 46 M ASY 115 0 0 Normal 113 Y 1.5 Flat 1
357 53 M ATA 120 0 0 Normal 95 N 0.0 Flat 1
358 38 M NAP 115 0 0 Normal 128 Y 0.0 Flat 1
359 53 M NAP 105 0 0 Normal 115 N 0.0 Flat 1
360 62 M NAP 160 0 0 Normal 72 Y 0.0 Flat 1
361 47 M ASY 160 0 0 Normal 124 Y 0.0 Flat 1
362 56 M NAP 155 0 0 ST 99 N 0.0 Flat 1
363 56 M ASY 120 0 0 ST 148 N 0.0 Flat 1
364 56 M NAP 120 0 0 Normal 97 N 0.0 Flat 0
365 64 F ASY 200 0 0 Normal 140 Y 1.0 Flat 1
366 61 M ASY 150 0 0 Normal 117 Y 2.0 Flat 1
367 68 M ASY 135 0 0 ST 120 Y 0.0 Up 1
368 57 M ASY 140 0 0 Normal 120 Y 2.0 Flat 1
369 63 M ASY 150 0 0 Normal 86 Y 2.0 Flat 1
370 60 M ASY 135 0 0 Normal 63 Y 0.5 Up 1
371 66 M ASY 150 0 0 Normal 108 Y 2.0 Flat 1
372 63 M ASY 185 0 0 Normal 98 Y 0.0 Up 1
373 59 M ASY 135 0 0 Normal 115 Y 1.0 Flat 1
374 61 M ASY 125 0 0 Normal 105 Y 0.0 Down 1
375 73 F NAP 160 0 0 ST 121 N 0.0 Up 1
376 47 M NAP 155 0 0 Normal 118 Y 1.0 Flat 1
377 65 M ASY 160 0 1 ST 122 N 1.2 Flat 1
378 70 M ASY 140 0 1 Normal 157 Y 2.0 Flat 1
379 50 M ASY 120 0 0 ST 156 Y 0.0 Up 1
380 60 M ASY 160 0 0 ST 99 Y 0.5 Flat 1
381 50 M ASY 115 0 0 Normal 120 Y 0.5 Flat 1
382 43 M ASY 115 0 0 Normal 145 Y 2.0 Flat 1
383 38 F ASY 110 0 0 Normal 156 N 0.0 Flat 1
384 54 M ASY 120 0 0 Normal 155 N 0.0 Flat 1
385 61 M ASY 150 0 0 Normal 105 Y 0.0 Flat 1
386 42 M ASY 145 0 0 Normal 99 Y 0.0 Flat 1
387 53 M ASY 130 0 0 LVH 135 Y 1.0 Flat 1
388 55 M ASY 140 0 0 Normal 83 N 0.0 Flat 1
389 61 M ASY 160 0 1 ST 145 N 1.0 Flat 1
390 51 M ASY 140 0 0 Normal 60 N 0.0 Flat 1
391 70 M ASY 115 0 0 ST 92 Y 0.0 Flat 1
392 61 M ASY 130 0 0 LVH 115 N 0.0 Flat 1
393 38 M ASY 150 0 1 Normal 120 Y 0.7 Flat 1
394 57 M ASY 160 0 1 Normal 98 Y 2.0 Flat 1
395 38 M ASY 135 0 1 Normal 150 N 0.0 Flat 1
396 62 F TA 140 0 1 Normal 143 N 0.0 Flat 1
397 58 M ASY 170 0 1 ST 105 Y 0.0 Flat 1
398 52 M ASY 165 0 1 Normal 122 Y 1.0 Up 1
399 61 M NAP 200 0 1 ST 70 N 0.0 Flat 1
400 50 F ASY 160 0 1 Normal 110 N 0.0 Flat 1
401 51 M ASY 130 0 1 ST 163 N 0.0 Flat 1
402 65 M ASY 145 0 1 ST 67 N 0.7 Flat 1
403 52 M ASY 135 0 1 Normal 128 Y 2.0 Flat 1
404 47 M NAP 110 0 1 Normal 120 Y 0.0 Flat 1
405 35 M ASY 120 0 1 Normal 130 Y 1.2 Flat 1
406 57 M ASY 140 0 1 Normal 100 Y 0.0 Flat 1
407 62 M ASY 115 0 1 Normal 72 Y -0.5 Flat 1
408 59 M ASY 110 0 1 Normal 94 N 0.0 Flat 1
409 53 M NAP 160 0 1 LVH 122 Y 0.0 Flat 1
410 62 M ASY 150 0 1 ST 78 N 2.0 Flat 1
411 54 M ASY 180 0 1 Normal 150 N 1.5 Flat 1
412 56 M ASY 125 0 1 Normal 103 Y 1.0 Flat 1
413 56 M NAP 125 0 1 Normal 98 N -2.0 Flat 1
414 54 M ASY 130 0 1 Normal 110 Y 3.0 Flat 1
415 66 F ASY 155 0 1 Normal 90 N 0.0 Flat 1
416 63 M ASY 140 260 0 ST 112 Y 3.0 Flat 1
417 44 M ASY 130 209 0 ST 127 N 0.0 Up 0
418 60 M ASY 132 218 0 ST 140 Y 1.5 Down 1
419 55 M ASY 142 228 0 ST 149 Y 2.5 Up 1
420 66 M NAP 110 213 1 LVH 99 Y 1.3 Flat 0
421 66 M NAP 120 0 0 ST 120 N -0.5 Up 0
422 65 M ASY 150 236 1 ST 105 Y 0.0 Flat 1
423 60 M NAP 180 0 0 ST 140 Y 1.5 Flat 0
424 60 M NAP 120 0 1 Normal 141 Y 2.0 Up 1
425 60 M ATA 160 267 1 ST 157 N 0.5 Flat 1
426 56 M ATA 126 166 0 ST 140 N 0.0 Up 0
427 59 M ASY 140 0 0 ST 117 Y 1.0 Flat 1
428 62 M ASY 110 0 0 Normal 120 Y 0.5 Flat 1
429 63 M NAP 133 0 0 LVH 120 Y 1.0 Flat 1
430 57 M ASY 128 0 1 ST 148 Y 1.0 Flat 1
431 62 M ASY 120 220 0 ST 86 N 0.0 Up 0
432 63 M ASY 170 177 0 Normal 84 Y 2.5 Down 1
433 46 M ASY 110 236 0 Normal 125 Y 2.0 Flat 1
434 63 M ASY 126 0 0 ST 120 N 1.5 Down 0
435 60 M ASY 152 0 0 ST 118 Y 0.0 Up 0
436 58 M ASY 116 0 0 Normal 124 N 1.0 Up 1
437 64 M ASY 120 0 1 ST 106 N 2.0 Flat 1
438 63 M NAP 130 0 0 ST 111 Y 0.0 Flat 1
439 74 M NAP 138 0 0 Normal 116 N 0.2 Up 0
440 52 M NAP 128 0 0 ST 180 N 3.0 Up 1
441 69 M ASY 130 0 1 ST 129 N 1.0 Flat 1
442 51 M ASY 128 0 1 ST 125 Y 1.2 Flat 1
443 60 M ASY 130 186 1 ST 140 Y 0.5 Flat 1
444 56 M ASY 120 100 0 Normal 120 Y 1.5 Flat 1
445 55 M NAP 136 228 0 ST 124 Y 1.6 Flat 1
446 54 M ASY 130 0 0 ST 117 Y 1.4 Flat 1
447 77 M ASY 124 171 0 ST 110 Y 2.0 Up 1
448 63 M ASY 160 230 1 Normal 105 Y 1.0 Flat 1
449 55 M NAP 0 0 0 Normal 155 N 1.5 Flat 1
450 52 M NAP 122 0 0 Normal 110 Y 2.0 Down 1
451 64 M ASY 144 0 0 ST 122 Y 1.0 Flat 1
452 60 M ASY 140 281 0 ST 118 Y 1.5 Flat 1
453 60 M ASY 120 0 0 Normal 133 Y 2.0 Up 0
454 58 M ASY 136 203 1 Normal 123 Y 1.2 Flat 1
455 59 M ASY 154 0 0 ST 131 Y 1.5 Up 0
456 61 M NAP 120 0 0 Normal 80 Y 0.0 Flat 1
457 40 M ASY 125 0 1 Normal 165 N 0.0 Flat 1
458 61 M ASY 134 0 1 ST 86 N 1.5 Flat 1
459 41 M ASY 104 0 0 ST 111 N 0.0 Up 0
460 57 M ASY 139 277 1 ST 118 Y 1.9 Flat 1
461 63 M ASY 136 0 0 Normal 84 Y 0.0 Flat 1
462 59 M ASY 122 233 0 Normal 117 Y 1.3 Down 1
463 51 M ASY 128 0 0 Normal 107 N 0.0 Up 0
464 59 M NAP 131 0 0 Normal 128 Y 2.0 Down 1
465 42 M NAP 134 240 0 Normal 160 N 0.0 Up 0
466 55 M NAP 120 0 0 ST 125 Y 2.5 Flat 1
467 63 F ATA 132 0 0 Normal 130 N 0.1 Up 0
468 62 M ASY 152 153 0 ST 97 Y 1.6 Up 1
469 56 M ATA 124 224 1 Normal 161 N 2.0 Flat 0
470 53 M ASY 126 0 0 Normal 106 N 0.0 Flat 1
471 68 M ASY 138 0 0 Normal 130 Y 3.0 Flat 1
472 53 M ASY 154 0 1 ST 140 Y 1.5 Flat 1
473 60 M NAP 141 316 1 ST 122 Y 1.7 Flat 1
474 62 M ATA 131 0 0 Normal 130 N 0.1 Up 0
475 59 M ASY 178 0 1 LVH 120 Y 0.0 Flat 1
476 51 M ASY 132 218 1 LVH 139 N 0.1 Up 0
477 61 M ASY 110 0 1 Normal 108 Y 2.0 Down 1
478 57 M ASY 130 311 1 ST 148 Y 2.0 Flat 1
479 56 M NAP 170 0 0 LVH 123 Y 2.5 Flat 1
480 58 M ATA 126 0 1 Normal 110 Y 2.0 Flat 1
481 69 M NAP 140 0 1 ST 118 N 2.5 Down 1
482 67 M TA 142 270 1 Normal 125 N 2.5 Up 1
483 58 M ASY 120 0 0 LVH 106 Y 1.5 Down 1
484 65 M ASY 134 0 0 Normal 112 Y 1.1 Flat 1
485 63 M ATA 139 217 1 ST 128 Y 1.2 Flat 1
486 55 M ATA 110 214 1 ST 180 N 0.4 Up 0
487 57 M ASY 140 214 0 ST 144 Y 2.0 Flat 1
488 65 M TA 140 252 0 Normal 135 N 0.3 Up 0
489 54 M ASY 136 220 0 Normal 140 Y 3.0 Flat 1
490 72 M NAP 120 214 0 Normal 102 Y 1.0 Flat 1
491 75 M ASY 170 203 1 ST 108 N 0.0 Flat 1
492 49 M TA 130 0 0 ST 145 N 3.0 Flat 1
493 51 M NAP 137 339 0 Normal 127 Y 1.7 Flat 1
494 60 M ASY 142 216 0 Normal 110 Y 2.5 Flat 1
495 64 F ASY 142 276 0 Normal 140 Y 1.0 Flat 1
496 58 M ASY 132 458 1 Normal 69 N 1.0 Down 0
497 61 M ASY 146 241 0 Normal 148 Y 3.0 Down 1
498 67 M ASY 160 384 1 ST 130 Y 0.0 Flat 1
499 62 M ASY 135 297 0 Normal 130 Y 1.0 Flat 1
500 65 M ASY 136 248 0 Normal 140 Y 4.0 Down 1
501 63 M ASY 130 308 0 Normal 138 Y 2.0 Flat 1
502 69 M ASY 140 208 0 ST 140 Y 2.0 Flat 1
503 51 M ASY 132 227 1 ST 138 N 0.2 Up 0
504 62 M ASY 158 210 1 Normal 112 Y 3.0 Down 1
505 55 M NAP 136 245 1 ST 131 Y 1.2 Flat 1
506 75 M ASY 136 225 0 Normal 112 Y 3.0 Flat 1
507 40 M NAP 106 240 0 Normal 80 Y 0.0 Up 0
508 67 M ASY 120 0 1 Normal 150 N 1.5 Down 1
509 58 M ASY 110 198 0 Normal 110 N 0.0 Flat 1
510 60 M ASY 136 195 0 Normal 126 N 0.3 Up 0
511 63 M ASY 160 267 1 ST 88 Y 2.0 Flat 1
512 35 M NAP 123 161 0 ST 153 N -0.1 Up 0
513 62 M TA 112 258 0 ST 150 Y 1.3 Flat 1
514 43 M ASY 122 0 0 Normal 120 N 0.5 Up 1
515 63 M NAP 130 0 1 ST 160 N 3.0 Flat 0
516 68 M NAP 150 195 1 Normal 132 N 0.0 Flat 1
517 65 M ASY 150 235 0 Normal 120 Y 1.5 Flat 1
518 48 M NAP 102 0 1 ST 110 Y 1.0 Down 1
519 63 M ASY 96 305 0 ST 121 Y 1.0 Up 1
520 64 M ASY 130 223 0 ST 128 N 0.5 Flat 0
521 61 M ASY 120 282 0 ST 135 Y 4.0 Down 1
522 50 M ASY 144 349 0 LVH 120 Y 1.0 Up 1
523 59 M ASY 124 160 0 Normal 117 Y 1.0 Flat 1
524 55 M ASY 150 160 0 ST 150 N 0.0 Up 0
525 45 M NAP 130 236 0 Normal 144 N 0.1 Up 0
526 65 M ASY 144 312 0 LVH 113 Y 1.7 Flat 1
527 61 M ATA 139 283 0 Normal 135 N 0.3 Up 0
528 49 M NAP 131 142 0 Normal 127 Y 1.5 Flat 1
529 72 M ASY 143 211 0 Normal 109 Y 1.4 Flat 1
530 50 M ASY 133 218 0 Normal 128 Y 1.1 Flat 1
531 64 M ASY 143 306 1 ST 115 Y 1.8 Flat 1
532 55 M ASY 116 186 1 ST 102 N 0.0 Flat 1
533 63 M ASY 110 252 0 ST 140 Y 2.0 Flat 1
534 59 M ASY 125 222 0 Normal 135 Y 2.5 Down 1
535 56 M ASY 130 0 0 LVH 122 Y 1.0 Flat 1
536 62 M NAP 133 0 1 ST 119 Y 1.2 Flat 1
537 74 M ASY 150 258 1 ST 130 Y 4.0 Down 1
538 54 M ASY 130 202 1 Normal 112 Y 2.0 Flat 1
539 57 M ASY 110 197 0 LVH 100 N 0.0 Up 0
540 62 M NAP 138 204 0 ST 122 Y 1.2 Flat 1
541 76 M NAP 104 113 0 LVH 120 N 3.5 Down 1
542 54 F ASY 138 274 0 Normal 105 Y 1.5 Flat 1
543 70 M ASY 170 192 0 ST 129 Y 3.0 Down 1
544 61 F ATA 140 298 1 Normal 120 Y 0.0 Up 0
545 48 M ASY 132 272 0 ST 139 N 0.2 Up 0
546 48 M NAP 132 220 1 ST 162 N 0.0 Flat 1
547 61 M TA 142 200 1 ST 100 N 1.5 Down 1
548 66 M ASY 112 261 0 Normal 140 N 1.5 Up 1
549 68 M TA 139 181 1 ST 135 N 0.2 Up 0
550 55 M ASY 172 260 0 Normal 73 N 2.0 Flat 1
551 62 M NAP 120 220 0 LVH 86 N 0.0 Up 0
552 71 M NAP 144 221 0 Normal 108 Y 1.8 Flat 1
553 74 M TA 145 216 1 Normal 116 Y 1.8 Flat 1
554 53 M NAP 155 175 1 ST 160 N 0.3 Up 0
555 58 M NAP 150 219 0 ST 118 Y 0.0 Flat 1
556 75 M ASY 160 310 1 Normal 112 Y 2.0 Down 0
557 56 M NAP 137 208 1 ST 122 Y 1.8 Flat 1
558 58 M NAP 137 232 0 ST 124 Y 1.4 Flat 1
559 64 M ASY 134 273 0 Normal 102 Y 4.0 Down 1
560 54 M NAP 133 203 0 ST 137 N 0.2 Up 0
561 54 M ATA 132 182 0 ST 141 N 0.1 Up 0
562 59 M ASY 140 274 0 Normal 154 Y 2.0 Flat 0
563 55 M ASY 135 204 1 ST 126 Y 1.1 Flat 1
564 57 M ASY 144 270 1 ST 160 Y 2.0 Flat 1
565 61 M ASY 141 292 0 ST 115 Y 1.7 Flat 1
566 41 M ASY 150 171 0 Normal 128 Y 1.5 Flat 0
567 71 M ASY 130 221 0 ST 115 Y 0.0 Flat 1
568 38 M ASY 110 289 0 Normal 105 Y 1.5 Down 1
569 55 M ASY 158 217 0 Normal 110 Y 2.5 Flat 1
570 56 M ASY 128 223 0 ST 119 Y 2.0 Down 1
571 69 M ASY 140 110 1 Normal 109 Y 1.5 Flat 1
572 64 M ASY 150 193 0 ST 135 Y 0.5 Flat 1
573 72 M ASY 160 123 1 LVH 130 N 1.5 Flat 1
574 69 M ASY 142 210 1 ST 112 Y 1.5 Flat 1
575 56 M ASY 137 282 1 Normal 126 Y 1.2 Flat 1
576 62 M ASY 139 170 0 ST 120 Y 3.0 Flat 1
577 67 M ASY 146 369 0 Normal 110 Y 1.9 Flat 1
578 57 M ASY 156 173 0 LVH 119 Y 3.0 Down 1
579 69 M ASY 145 289 1 ST 110 Y 1.8 Flat 1
580 51 M ASY 131 152 1 LVH 130 Y 1.0 Flat 1
581 48 M ASY 140 208 0 Normal 159 Y 1.5 Up 1
582 69 M ASY 122 216 1 LVH 84 Y 0.0 Flat 1
583 69 M NAP 142 271 0 LVH 126 N 0.3 Up 0
584 64 M ASY 141 244 1 ST 116 Y 1.5 Flat 1
585 57 M ATA 180 285 1 ST 120 N 0.8 Flat 1
586 53 M ASY 124 243 0 Normal 122 Y 2.0 Flat 1
587 37 M NAP 118 240 0 LVH 165 N 1.0 Flat 0
588 67 M ASY 140 219 0 ST 122 Y 2.0 Flat 1
589 74 M NAP 140 237 1 Normal 94 N 0.0 Flat 1
590 63 M ATA 136 165 0 ST 133 N 0.2 Up 0
591 58 M ASY 100 213 0 ST 110 N 0.0 Up 0
592 61 M ASY 190 287 1 LVH 150 Y 2.0 Down 1
593 64 M ASY 130 258 1 LVH 130 N 0.0 Flat 1
594 58 M ASY 160 256 1 LVH 113 Y 1.0 Up 1
595 60 M ASY 130 186 1 LVH 140 Y 0.5 Flat 1
596 57 M ASY 122 264 0 LVH 100 N 0.0 Flat 1
597 55 M NAP 133 185 0 ST 136 N 0.2 Up 0
598 55 M ASY 120 226 0 LVH 127 Y 1.7 Down 1
599 56 M ASY 130 203 1 Normal 98 N 1.5 Flat 1
600 57 M ASY 130 207 0 ST 96 Y 1.0 Flat 0
601 61 M NAP 140 284 0 Normal 123 Y 1.3 Flat 1
602 61 M NAP 120 337 0 Normal 98 Y 0.0 Flat 1
603 74 M ASY 155 310 0 Normal 112 Y 1.5 Down 1
604 68 M NAP 134 254 1 Normal 151 Y 0.0 Up 0
605 51 F ASY 114 258 1 LVH 96 N 1.0 Up 0
606 62 M ASY 160 254 1 ST 108 Y 3.0 Flat 1
607 53 M ASY 144 300 1 ST 128 Y 1.5 Flat 1
608 62 M ASY 158 170 0 ST 138 Y 0.0 Flat 1
609 46 M ASY 134 310 0 Normal 126 N 0.0 Flat 1
610 54 F ASY 127 333 1 ST 154 N 0.0 Flat 1
611 62 M TA 135 139 0 ST 137 N 0.2 Up 0
612 55 M ASY 122 223 1 ST 100 N 0.0 Flat 1
613 58 M ASY 140 385 1 LVH 135 N 0.3 Up 0
614 62 M ATA 120 254 0 LVH 93 Y 0.0 Flat 1
615 70 M ASY 130 322 0 LVH 109 N 2.4 Flat 1
616 67 F NAP 115 564 0 LVH 160 N 1.6 Flat 0
617 57 M ATA 124 261 0 Normal 141 N 0.3 Up 1
618 64 M ASY 128 263 0 Normal 105 Y 0.2 Flat 0
619 74 F ATA 120 269 0 LVH 121 Y 0.2 Up 0
620 65 M ASY 120 177 0 Normal 140 N 0.4 Up 0
621 56 M NAP 130 256 1 LVH 142 Y 0.6 Flat 1
622 59 M ASY 110 239 0 LVH 142 Y 1.2 Flat 1
623 60 M ASY 140 293 0 LVH 170 N 1.2 Flat 1
624 63 F ASY 150 407 0 LVH 154 N 4.0 Flat 1
625 59 M ASY 135 234 0 Normal 161 N 0.5 Flat 0
626 53 M ASY 142 226 0 LVH 111 Y 0.0 Up 0
627 44 M NAP 140 235 0 LVH 180 N 0.0 Up 0
628 61 M TA 134 234 0 Normal 145 N 2.6 Flat 1
629 57 F ASY 128 303 0 LVH 159 N 0.0 Up 0
630 71 F ASY 112 149 0 Normal 125 N 1.6 Flat 0
631 46 M ASY 140 311 0 Normal 120 Y 1.8 Flat 1
632 53 M ASY 140 203 1 LVH 155 Y 3.1 Down 1
633 64 M TA 110 211 0 LVH 144 Y 1.8 Flat 0
634 40 M TA 140 199 0 Normal 178 Y 1.4 Up 0
635 67 M ASY 120 229 0 LVH 129 Y 2.6 Flat 1
636 48 M ATA 130 245 0 LVH 180 N 0.2 Flat 0
637 43 M ASY 115 303 0 Normal 181 N 1.2 Flat 0
638 47 M ASY 112 204 0 Normal 143 N 0.1 Up 0
639 54 F ATA 132 288 1 LVH 159 Y 0.0 Up 0
640 48 F NAP 130 275 0 Normal 139 N 0.2 Up 0
641 46 F ASY 138 243 0 LVH 152 Y 0.0 Flat 0
642 51 F NAP 120 295 0 LVH 157 N 0.6 Up 0
643 58 M NAP 112 230 0 LVH 165 N 2.5 Flat 1
644 71 F NAP 110 265 1 LVH 130 N 0.0 Up 0
645 57 M NAP 128 229 0 LVH 150 N 0.4 Flat 1
646 66 M ASY 160 228 0 LVH 138 N 2.3 Up 0
647 37 F NAP 120 215 0 Normal 170 N 0.0 Up 0
648 59 M ASY 170 326 0 LVH 140 Y 3.4 Down 1
649 50 M ASY 144 200 0 LVH 126 Y 0.9 Flat 1
650 48 M ASY 130 256 1 LVH 150 Y 0.0 Up 1
651 61 M ASY 140 207 0 LVH 138 Y 1.9 Up 1
652 59 M TA 160 273 0 LVH 125 N 0.0 Up 1
653 42 M NAP 130 180 0 Normal 150 N 0.0 Up 0
654 48 M ASY 122 222 0 LVH 186 N 0.0 Up 0
655 40 M ASY 152 223 0 Normal 181 N 0.0 Up 1
656 62 F ASY 124 209 0 Normal 163 N 0.0 Up 0
657 44 M NAP 130 233 0 Normal 179 Y 0.4 Up 0
658 46 M ATA 101 197 1 Normal 156 N 0.0 Up 0
659 59 M NAP 126 218 1 Normal 134 N 2.2 Flat 1
660 58 M NAP 140 211 1 LVH 165 N 0.0 Up 0
661 49 M NAP 118 149 0 LVH 126 N 0.8 Up 1
662 44 M ASY 110 197 0 LVH 177 N 0.0 Up 1
663 66 M ATA 160 246 0 Normal 120 Y 0.0 Flat 1
664 65 F ASY 150 225 0 LVH 114 N 1.0 Flat 1
665 42 M ASY 136 315 0 Normal 125 Y 1.8 Flat 1
666 52 M ATA 128 205 1 Normal 184 N 0.0 Up 0
667 65 F NAP 140 417 1 LVH 157 N 0.8 Up 0
668 63 F ATA 140 195 0 Normal 179 N 0.0 Up 0
669 45 F ATA 130 234 0 LVH 175 N 0.6 Flat 0
670 41 F ATA 105 198 0 Normal 168 N 0.0 Up 0
671 61 M ASY 138 166 0 LVH 125 Y 3.6 Flat 1
672 60 F NAP 120 178 1 Normal 96 N 0.0 Up 0
673 59 F ASY 174 249 0 Normal 143 Y 0.0 Flat 1
674 62 M ATA 120 281 0 LVH 103 N 1.4 Flat 1
675 57 M NAP 150 126 1 Normal 173 N 0.2 Up 0
676 51 F ASY 130 305 0 Normal 142 Y 1.2 Flat 1
677 44 M NAP 120 226 0 Normal 169 N 0.0 Up 0
678 60 F TA 150 240 0 Normal 171 N 0.9 Up 0
679 63 M TA 145 233 1 LVH 150 N 2.3 Down 0
680 57 M ASY 150 276 0 LVH 112 Y 0.6 Flat 1
681 51 M ASY 140 261 0 LVH 186 Y 0.0 Up 0
682 58 F ATA 136 319 1 LVH 152 N 0.0 Up 1
683 44 F NAP 118 242 0 Normal 149 N 0.3 Flat 0
684 47 M NAP 108 243 0 Normal 152 N 0.0 Up 1
685 61 M ASY 120 260 0 Normal 140 Y 3.6 Flat 1
686 57 F ASY 120 354 0 Normal 163 Y 0.6 Up 0
687 70 M ATA 156 245 0 LVH 143 N 0.0 Up 0
688 76 F NAP 140 197 0 ST 116 N 1.1 Flat 0
689 67 F ASY 106 223 0 Normal 142 N 0.3 Up 0
690 45 M ASY 142 309 0 LVH 147 Y 0.0 Flat 1
691 45 M ASY 104 208 0 LVH 148 Y 3.0 Flat 0
692 39 F NAP 94 199 0 Normal 179 N 0.0 Up 0
693 42 F NAP 120 209 0 Normal 173 N 0.0 Flat 0
694 56 M ATA 120 236 0 Normal 178 N 0.8 Up 0
695 58 M ASY 146 218 0 Normal 105 N 2.0 Flat 1
696 35 M ASY 120 198 0 Normal 130 Y 1.6 Flat 1
697 58 M ASY 150 270 0 LVH 111 Y 0.8 Up 1
698 41 M NAP 130 214 0 LVH 168 N 2.0 Flat 0
699 57 M ASY 110 201 0 Normal 126 Y 1.5 Flat 0
700 42 M TA 148 244 0 LVH 178 N 0.8 Up 0
701 62 M ATA 128 208 1 LVH 140 N 0.0 Up 0
702 59 M TA 178 270 0 LVH 145 N 4.2 Down 0
703 41 F ATA 126 306 0 Normal 163 N 0.0 Up 0
704 50 M ASY 150 243 0 LVH 128 N 2.6 Flat 1
705 59 M ATA 140 221 0 Normal 164 Y 0.0 Up 0
706 61 F ASY 130 330 0 LVH 169 N 0.0 Up 1
707 54 M ASY 124 266 0 LVH 109 Y 2.2 Flat 1
708 54 M ASY 110 206 0 LVH 108 Y 0.0 Flat 1
709 52 M ASY 125 212 0 Normal 168 N 1.0 Up 1
710 47 M ASY 110 275 0 LVH 118 Y 1.0 Flat 1
711 66 M ASY 120 302 0 LVH 151 N 0.4 Flat 0
712 58 M ASY 100 234 0 Normal 156 N 0.1 Up 1
713 64 F NAP 140 313 0 Normal 133 N 0.2 Up 0
714 50 F ATA 120 244 0 Normal 162 N 1.1 Up 0
715 44 F NAP 108 141 0 Normal 175 N 0.6 Flat 0
716 67 M ASY 120 237 0 Normal 71 N 1.0 Flat 1
717 49 F ASY 130 269 0 Normal 163 N 0.0 Up 0
718 57 M ASY 165 289 1 LVH 124 N 1.0 Flat 1
719 63 M ASY 130 254 0 LVH 147 N 1.4 Flat 1
720 48 M ASY 124 274 0 LVH 166 N 0.5 Flat 1
721 51 M NAP 100 222 0 Normal 143 Y 1.2 Flat 0
722 60 F ASY 150 258 0 LVH 157 N 2.6 Flat 1
723 59 M ASY 140 177 0 Normal 162 Y 0.0 Up 1
724 45 F ATA 112 160 0 Normal 138 N 0.0 Flat 0
725 55 F ASY 180 327 0 ST 117 Y 3.4 Flat 1
726 41 M ATA 110 235 0 Normal 153 N 0.0 Up 0
727 60 F ASY 158 305 0 LVH 161 N 0.0 Up 1
728 54 F NAP 135 304 1 Normal 170 N 0.0 Up 0
729 42 M ATA 120 295 0 Normal 162 N 0.0 Up 0
730 49 F ATA 134 271 0 Normal 162 N 0.0 Flat 0
731 46 M ASY 120 249 0 LVH 144 N 0.8 Up 1
732 56 F ASY 200 288 1 LVH 133 Y 4.0 Down 1
733 66 F TA 150 226 0 Normal 114 N 2.6 Down 0
734 56 M ASY 130 283 1 LVH 103 Y 1.6 Down 1
735 49 M NAP 120 188 0 Normal 139 N 2.0 Flat 1
736 54 M ASY 122 286 0 LVH 116 Y 3.2 Flat 1
737 57 M ASY 152 274 0 Normal 88 Y 1.2 Flat 1
738 65 F NAP 160 360 0 LVH 151 N 0.8 Up 0
739 54 M NAP 125 273 0 LVH 152 N 0.5 Down 0
740 54 F NAP 160 201 0 Normal 163 N 0.0 Up 0
741 62 M ASY 120 267 0 Normal 99 Y 1.8 Flat 1
742 52 F NAP 136 196 0 LVH 169 N 0.1 Flat 0
743 52 M ATA 134 201 0 Normal 158 N 0.8 Up 0
744 60 M ASY 117 230 1 Normal 160 Y 1.4 Up 1
745 63 F ASY 108 269 0 Normal 169 Y 1.8 Flat 1
746 66 M ASY 112 212 0 LVH 132 Y 0.1 Up 1
747 42 M ASY 140 226 0 Normal 178 N 0.0 Up 0
748 64 M ASY 120 246 0 LVH 96 Y 2.2 Down 1
749 54 M NAP 150 232 0 LVH 165 N 1.6 Up 0
750 46 F NAP 142 177 0 LVH 160 Y 1.4 Down 0
751 67 F NAP 152 277 0 Normal 172 N 0.0 Up 0
752 56 M ASY 125 249 1 LVH 144 Y 1.2 Flat 1
753 34 F ATA 118 210 0 Normal 192 N 0.7 Up 0
754 57 M ASY 132 207 0 Normal 168 Y 0.0 Up 0
755 64 M ASY 145 212 0 LVH 132 N 2.0 Flat 1
756 59 M ASY 138 271 0 LVH 182 N 0.0 Up 0
757 50 M NAP 140 233 0 Normal 163 N 0.6 Flat 1
758 51 M TA 125 213 0 LVH 125 Y 1.4 Up 0
759 54 M ATA 192 283 0 LVH 195 N 0.0 Up 1
760 53 M ASY 123 282 0 Normal 95 Y 2.0 Flat 1
761 52 M ASY 112 230 0 Normal 160 N 0.0 Up 1
762 40 M ASY 110 167 0 LVH 114 Y 2.0 Flat 1
763 58 M NAP 132 224 0 LVH 173 N 3.2 Up 1
764 41 F NAP 112 268 0 LVH 172 Y 0.0 Up 0
765 41 M NAP 112 250 0 Normal 179 N 0.0 Up 0
766 50 F NAP 120 219 0 Normal 158 N 1.6 Flat 0
767 54 F NAP 108 267 0 LVH 167 N 0.0 Up 0
768 64 F ASY 130 303 0 Normal 122 N 2.0 Flat 0
769 51 F NAP 130 256 0 LVH 149 N 0.5 Up 0
770 46 F ATA 105 204 0 Normal 172 N 0.0 Up 0
771 55 M ASY 140 217 0 Normal 111 Y 5.6 Down 1
772 45 M ATA 128 308 0 LVH 170 N 0.0 Up 0
773 56 M TA 120 193 0 LVH 162 N 1.9 Flat 0
774 66 F ASY 178 228 1 Normal 165 Y 1.0 Flat 1
775 38 M TA 120 231 0 Normal 182 Y 3.8 Flat 1
776 62 F ASY 150 244 0 Normal 154 Y 1.4 Flat 1
777 55 M ATA 130 262 0 Normal 155 N 0.0 Up 0
778 58 M ASY 128 259 0 LVH 130 Y 3.0 Flat 1
779 43 M ASY 110 211 0 Normal 161 N 0.0 Up 0
780 64 F ASY 180 325 0 Normal 154 Y 0.0 Up 0
781 50 F ASY 110 254 0 LVH 159 N 0.0 Up 0
782 53 M NAP 130 197 1 LVH 152 N 1.2 Down 0
783 45 F ASY 138 236 0 LVH 152 Y 0.2 Flat 0
784 65 M TA 138 282 1 LVH 174 N 1.4 Flat 1
785 69 M TA 160 234 1 LVH 131 N 0.1 Flat 0
786 69 M NAP 140 254 0 LVH 146 N 2.0 Flat 1
787 67 M ASY 100 299 0 LVH 125 Y 0.9 Flat 1
788 68 F NAP 120 211 0 LVH 115 N 1.5 Flat 0
789 34 M TA 118 182 0 LVH 174 N 0.0 Up 0
790 62 F ASY 138 294 1 Normal 106 N 1.9 Flat 1
791 51 M ASY 140 298 0 Normal 122 Y 4.2 Flat 1
792 46 M NAP 150 231 0 Normal 147 N 3.6 Flat 1
793 67 M ASY 125 254 1 Normal 163 N 0.2 Flat 1
794 50 M NAP 129 196 0 Normal 163 N 0.0 Up 0
795 42 M NAP 120 240 1 Normal 194 N 0.8 Down 0
796 56 F ASY 134 409 0 LVH 150 Y 1.9 Flat 1
797 41 M ASY 110 172 0 LVH 158 N 0.0 Up 1
798 42 F ASY 102 265 0 LVH 122 N 0.6 Flat 0
799 53 M NAP 130 246 1 LVH 173 N 0.0 Up 0
800 43 M NAP 130 315 0 Normal 162 N 1.9 Up 0
801 56 M ASY 132 184 0 LVH 105 Y 2.1 Flat 1
802 52 M ASY 108 233 1 Normal 147 N 0.1 Up 0
803 62 F ASY 140 394 0 LVH 157 N 1.2 Flat 0
804 70 M NAP 160 269 0 Normal 112 Y 2.9 Flat 1
805 54 M ASY 140 239 0 Normal 160 N 1.2 Up 0
806 70 M ASY 145 174 0 Normal 125 Y 2.6 Down 1
807 54 M ATA 108 309 0 Normal 156 N 0.0 Up 0
808 35 M ASY 126 282 0 LVH 156 Y 0.0 Up 1
809 48 M NAP 124 255 1 Normal 175 N 0.0 Up 0
810 55 F ATA 135 250 0 LVH 161 N 1.4 Flat 0
811 58 F ASY 100 248 0 LVH 122 N 1.0 Flat 0
812 54 F NAP 110 214 0 Normal 158 N 1.6 Flat 0
813 69 F TA 140 239 0 Normal 151 N 1.8 Up 0
814 77 M ASY 125 304 0 LVH 162 Y 0.0 Up 1
815 68 M NAP 118 277 0 Normal 151 N 1.0 Up 0
816 58 M ASY 125 300 0 LVH 171 N 0.0 Up 1
817 60 M ASY 125 258 0 LVH 141 Y 2.8 Flat 1
818 51 M ASY 140 299 0 Normal 173 Y 1.6 Up 1
819 55 M ASY 160 289 0 LVH 145 Y 0.8 Flat 1
820 52 M TA 152 298 1 Normal 178 N 1.2 Flat 0
821 60 F NAP 102 318 0 Normal 160 N 0.0 Up 0
822 58 M NAP 105 240 0 LVH 154 Y 0.6 Flat 0
823 64 M NAP 125 309 0 Normal 131 Y 1.8 Flat 1
824 37 M NAP 130 250 0 Normal 187 N 3.5 Down 0
825 59 M TA 170 288 0 LVH 159 N 0.2 Flat 1
826 51 M NAP 125 245 1 LVH 166 N 2.4 Flat 0
827 43 F NAP 122 213 0 Normal 165 N 0.2 Flat 0
828 58 M ASY 128 216 0 LVH 131 Y 2.2 Flat 1
829 29 M ATA 130 204 0 LVH 202 N 0.0 Up 0
830 41 F ATA 130 204 0 LVH 172 N 1.4 Up 0
831 63 F NAP 135 252 0 LVH 172 N 0.0 Up 0
832 51 M NAP 94 227 0 Normal 154 Y 0.0 Up 0
833 54 M NAP 120 258 0 LVH 147 N 0.4 Flat 0
834 44 M ATA 120 220 0 Normal 170 N 0.0 Up 0
835 54 M ASY 110 239 0 Normal 126 Y 2.8 Flat 1
836 65 M ASY 135 254 0 LVH 127 N 2.8 Flat 1
837 57 M NAP 150 168 0 Normal 174 N 1.6 Up 0
838 63 M ASY 130 330 1 LVH 132 Y 1.8 Up 1
839 35 F ASY 138 183 0 Normal 182 N 1.4 Up 0
840 41 M ATA 135 203 0 Normal 132 N 0.0 Flat 0
841 62 F NAP 130 263 0 Normal 97 N 1.2 Flat 1
842 43 F ASY 132 341 1 LVH 136 Y 3.0 Flat 1
843 58 F TA 150 283 1 LVH 162 N 1.0 Up 0
844 52 M TA 118 186 0 LVH 190 N 0.0 Flat 0
845 61 F ASY 145 307 0 LVH 146 Y 1.0 Flat 1
846 39 M ASY 118 219 0 Normal 140 N 1.2 Flat 1
847 45 M ASY 115 260 0 LVH 185 N 0.0 Up 0
848 52 M ASY 128 255 0 Normal 161 Y 0.0 Up 1
849 62 M NAP 130 231 0 Normal 146 N 1.8 Flat 0
850 62 F ASY 160 164 0 LVH 145 N 6.2 Down 1
851 53 F ASY 138 234 0 LVH 160 N 0.0 Up 0
852 43 M ASY 120 177 0 LVH 120 Y 2.5 Flat 1
853 47 M NAP 138 257 0 LVH 156 N 0.0 Up 0
854 52 M ATA 120 325 0 Normal 172 N 0.2 Up 0
855 68 M NAP 180 274 1 LVH 150 Y 1.6 Flat 1
856 39 M NAP 140 321 0 LVH 182 N 0.0 Up 0
857 53 F ASY 130 264 0 LVH 143 N 0.4 Flat 0
858 62 F ASY 140 268 0 LVH 160 N 3.6 Down 1
859 51 F NAP 140 308 0 LVH 142 N 1.5 Up 0
860 60 M ASY 130 253 0 Normal 144 Y 1.4 Up 1
861 65 M ASY 110 248 0 LVH 158 N 0.6 Up 1
862 65 F NAP 155 269 0 Normal 148 N 0.8 Up 0
863 60 M NAP 140 185 0 LVH 155 N 3.0 Flat 1
864 60 M ASY 145 282 0 LVH 142 Y 2.8 Flat 1
865 54 M ASY 120 188 0 Normal 113 N 1.4 Flat 1
866 44 M ATA 130 219 0 LVH 188 N 0.0 Up 0
867 44 M ASY 112 290 0 LVH 153 N 0.0 Up 1
868 51 M NAP 110 175 0 Normal 123 N 0.6 Up 0
869 59 M NAP 150 212 1 Normal 157 N 1.6 Up 0
870 71 F ATA 160 302 0 Normal 162 N 0.4 Up 0
871 61 M NAP 150 243 1 Normal 137 Y 1.0 Flat 0
872 55 M ASY 132 353 0 Normal 132 Y 1.2 Flat 1
873 64 M NAP 140 335 0 Normal 158 N 0.0 Up 1
874 43 M ASY 150 247 0 Normal 171 N 1.5 Up 0
875 58 F NAP 120 340 0 Normal 172 N 0.0 Up 0
876 60 M ASY 130 206 0 LVH 132 Y 2.4 Flat 1
877 58 M ATA 120 284 0 LVH 160 N 1.8 Flat 1
878 49 M ATA 130 266 0 Normal 171 N 0.6 Up 0
879 48 M ATA 110 229 0 Normal 168 N 1.0 Down 1
880 52 M NAP 172 199 1 Normal 162 N 0.5 Up 0
881 44 M ATA 120 263 0 Normal 173 N 0.0 Up 0
882 56 F ATA 140 294 0 LVH 153 N 1.3 Flat 0
883 57 M ASY 140 192 0 Normal 148 N 0.4 Flat 0
884 67 M ASY 160 286 0 LVH 108 Y 1.5 Flat 1
885 53 F NAP 128 216 0 LVH 115 N 0.0 Up 0
886 52 M NAP 138 223 0 Normal 169 N 0.0 Up 0
887 43 M ASY 132 247 1 LVH 143 Y 0.1 Flat 1
888 52 M ASY 128 204 1 Normal 156 Y 1.0 Flat 1
889 59 M TA 134 204 0 Normal 162 N 0.8 Up 1
890 64 M TA 170 227 0 LVH 155 N 0.6 Flat 0
891 66 F NAP 146 278 0 LVH 152 N 0.0 Flat 0
892 39 F NAP 138 220 0 Normal 152 N 0.0 Flat 0
893 57 M ATA 154 232 0 LVH 164 N 0.0 Up 1
894 58 F ASY 130 197 0 Normal 131 N 0.6 Flat 0
895 57 M ASY 110 335 0 Normal 143 Y 3.0 Flat 1
896 47 M NAP 130 253 0 Normal 179 N 0.0 Up 0
897 55 F ASY 128 205 0 ST 130 Y 2.0 Flat 1
898 35 M ATA 122 192 0 Normal 174 N 0.0 Up 0
899 61 M ASY 148 203 0 Normal 161 N 0.0 Up 1
900 58 M ASY 114 318 0 ST 140 N 4.4 Down 1
901 58 F ASY 170 225 1 LVH 146 Y 2.8 Flat 1
902 58 M ATA 125 220 0 Normal 144 N 0.4 Flat 0
903 56 M ATA 130 221 0 LVH 163 N 0.0 Up 0
904 56 M ATA 120 240 0 Normal 169 N 0.0 Down 0
905 67 M NAP 152 212 0 LVH 150 N 0.8 Flat 1
906 55 F ATA 132 342 0 Normal 166 N 1.2 Up 0
907 44 M ASY 120 169 0 Normal 144 Y 2.8 Down 1
908 63 M ASY 140 187 0 LVH 144 Y 4.0 Up 1
909 63 F ASY 124 197 0 Normal 136 Y 0.0 Flat 1
910 41 M ATA 120 157 0 Normal 182 N 0.0 Up 0
911 59 M ASY 164 176 1 LVH 90 N 1.0 Flat 1
912 57 F ASY 140 241 0 Normal 123 Y 0.2 Flat 1
913 45 M TA 110 264 0 Normal 132 N 1.2 Flat 1
914 68 M ASY 144 193 1 Normal 141 N 3.4 Flat 1
915 57 M ASY 130 131 0 Normal 115 Y 1.2 Flat 1
916 57 F ATA 130 236 0 LVH 174 N 0.0 Flat 1
917 38 M NAP 138 175 0 Normal 173 N 0.0 Up 0

Data Preparation - Step 1¶

This data set has 12 columns and there's no columns that can specifically identifying a patient.So no need of removing a column.¶

In [4]:
#Get features name
df.columns
Out[4]:
Index(['Age', 'Sex', 'ChestPainType', 'RestingBP', 'Cholesterol', 'FastingBS',
       'RestingECG', 'MaxHR', 'ExerciseAngina', 'Oldpeak', 'ST_Slope',
       'HeartDisease'],
      dtype='object')
In [5]:
## Display a description of the DataFrame with summary statistics
print("Describe our DataFrame :\n")
# Prints a summary of numerical columns with statistics such as count, mean, standard deviation, min, and max,
# rounding the results to two decimal places for readability
print(df.describe().round(2))
# Display DataFrame information
print("\nDataframe information:\n")
# Prints information about the DataFrame, including the index, column names, non-null counts, and data types
print(df.info())
Describe our DataFrame :

          Age  RestingBP  Cholesterol  FastingBS   MaxHR  Oldpeak  \
count  918.00     918.00       918.00     918.00  918.00   918.00   
mean    53.51     132.40       198.80       0.23  136.81     0.89   
std      9.43      18.51       109.38       0.42   25.46     1.07   
min     28.00       0.00         0.00       0.00   60.00    -2.60   
25%     47.00     120.00       173.25       0.00  120.00     0.00   
50%     54.00     130.00       223.00       0.00  138.00     0.60   
75%     60.00     140.00       267.00       0.00  156.00     1.50   
max     77.00     200.00       603.00       1.00  202.00     6.20   

       HeartDisease  
count        918.00  
mean           0.55  
std            0.50  
min            0.00  
25%            0.00  
50%            1.00  
75%            1.00  
max            1.00  

Dataframe information:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 918 entries, 0 to 917
Data columns (total 12 columns):
 #   Column          Non-Null Count  Dtype  
---  ------          --------------  -----  
 0   Age             918 non-null    int64  
 1   Sex             918 non-null    object 
 2   ChestPainType   918 non-null    object 
 3   RestingBP       918 non-null    int64  
 4   Cholesterol     918 non-null    int64  
 5   FastingBS       918 non-null    int64  
 6   RestingECG      918 non-null    object 
 7   MaxHR           918 non-null    int64  
 8   ExerciseAngina  918 non-null    object 
 9   Oldpeak         918 non-null    float64
 10  ST_Slope        918 non-null    object 
 11  HeartDisease    918 non-null    int64  
dtypes: float64(1), int64(6), object(5)
memory usage: 86.2+ KB
None
In [6]:
#Checking the missing value
df.isnull().sum()
Out[6]:
Age               0
Sex               0
ChestPainType     0
RestingBP         0
Cholesterol       0
FastingBS         0
RestingECG        0
MaxHR             0
ExerciseAngina    0
Oldpeak           0
ST_Slope          0
HeartDisease      0
dtype: int64
In [7]:
#Visualizing the missing value by seaborn library
sns.heatmap(df.isnull(),cmap = 'magma',cbar = False);
No description has been provided for this image

Data Cleanup¶

In [8]:
# Clean and replace invalid entries in the DataFrame
df = df.map(
  lambda x: x if x is np.NaN or not \
    isinstance(x, str) else str(x).strip('_')).replace(['', 'nan', '!@9#%8', '#F%$D@*&8'], np.NaN)
# Get the dimensions of the DataFrame (rows, columns)
df.shape
Out[8]:
(918, 12)
In [9]:
# Display the data types of each column in the DataFrame
df.dtypes
Out[9]:
Age                 int64
Sex                object
ChestPainType      object
RestingBP           int64
Cholesterol         int64
FastingBS           int64
RestingECG         object
MaxHR               int64
ExerciseAngina     object
Oldpeak           float64
ST_Slope           object
HeartDisease        int64
dtype: object

Data Preparation - Step 2¶

Oldpeak column shouldn't be an Object type as it has all numeric values. Let's convert that column to a Numeric Type¶

In [10]:
# Convert the 'Oldpeak' column to a numeric data type, handling errors by setting invalid parsing as NaN
df['Oldpeak'] = pd.to_numeric(df['Oldpeak'], errors='coerce').astype('float')
In [11]:
df.dtypes
Out[11]:
Age                 int64
Sex                object
ChestPainType      object
RestingBP           int64
Cholesterol         int64
FastingBS           int64
RestingECG         object
MaxHR               int64
ExerciseAngina     object
Oldpeak           float64
ST_Slope           object
HeartDisease        int64
dtype: object

Missing Values¶

In [12]:
# Calculate the sum of missing values in each column
missing_values_sum = df.isna().sum()

# Calculate the percentage of missing values for each column
total_rows = df.shape[0]
missing_values_percentage = (missing_values_sum / total_rows) * 100

# Get the data type of the column as well
column_datatypes = df.dtypes

# Create a DataFrame to display the results
missing_info = pd.DataFrame({
    'Data Type': column_datatypes,
    'Missing Values': missing_values_sum,
    'Percentage Missing (%)': missing_values_percentage
})

# Display the missing values sum and percentage
print(missing_info)
               Data Type  Missing Values  Percentage Missing (%)
Age                int64               0                     0.0
Sex               object               0                     0.0
ChestPainType     object               0                     0.0
RestingBP          int64               0                     0.0
Cholesterol        int64               0                     0.0
FastingBS          int64               0                     0.0
RestingECG        object               0                     0.0
MaxHR              int64               0                     0.0
ExerciseAngina    object               0                     0.0
Oldpeak          float64               0                     0.0
ST_Slope          object               0                     0.0
HeartDisease       int64               0                     0.0
In [13]:
# Create a bar plot for missing values percentage 
plt.figure(figsize=(10, 5))

missing_values_percentage.plot(kind='bar', color='lightcoral')
plt.title('Missing Values Percentage')
plt.xlabel('Columns')
plt.ylabel('Percentage (%)')

# Adjust spacing between plots
plt.tight_layout()

# Show the plot
plt.show()
No description has been provided for this image

According to the above results, no missing values were found in our dataset.¶

Categorical Data:¶

In [14]:
#Encoding categorical Data
df['Sex'] = df['Sex'].replace({'M': 1, 'F': 2})
df['ChestPainType'] = df['ChestPainType'].replace({'ATA': 1, 'NAP': 2, 'ASY': 3, 'TA': 4})
df['FastingBS'] = df['FastingBS'].replace({0: 1, 1: 2})
df['RestingECG'] = df['RestingECG'].replace({'Normal': 1, 'ST': 2, 'LVH': 3})
df['ExerciseAngina'] = df['ExerciseAngina'].replace({'N': 1, 'Y': 2})
df['ST_Slope'] = df['ST_Slope'].replace({'Up': 1, 'Flat': 2, 'Down': 3})
df['HeartDisease'] = df['HeartDisease'].replace({1: 1, 0: 2})
In [15]:
#separate categorical data/numerical data
df_num = df[['Age', 'RestingBP', 'Cholesterol', 'MaxHR', 'Oldpeak']]
df_cat = df[['Sex', 'ChestPainType','FastingBS', 'RestingECG', 'ExerciseAngina', 'ST_Slope', 'HeartDisease']]

df_num_name = ['Age', 'RestingBP', 'Cholesterol', 'MaxHR', 'Oldpeak']
df_cat_name = ['Sex', 'ChestPainType','FastingBS', 'RestingECG', 'ExerciseAngina', 'ST_Slope', 'HeartDisease']
In [16]:
#Easier way to separate numerical value and categorical value if we have many features 
col = list(df.columns)
categorical_features = []
numerical_features = []
for i in col:
    if len(df[i].unique()) > 6:
        numerical_features.append(i)
    else:
        categorical_features.append(i)

print('Categorical Features :',*categorical_features,'\n')
print('Numerical Features :',*numerical_features)
Categorical Features : Sex ChestPainType FastingBS RestingECG ExerciseAngina ST_Slope HeartDisease 

Numerical Features : Age RestingBP Cholesterol MaxHR Oldpeak

Outliers¶

In [17]:
for feature in df_num_name:
    plt.figure(figsize=(4,5))
    plt.boxplot(df[feature])
    plt.title(f'{feature}')
    plt.show()
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
In [18]:
#Detecting outliers
def find_outliers_IQR(df):

   q1=df.quantile(0.25)

   q3=df.quantile(0.75)

   IQR=q3-q1

   outliers = df[((df<(q1-1.5*IQR)) | (df>(q3+1.5*IQR)))]

   return outliers
In [19]:
for char in df_num_name :
    outliers = find_outliers_IQR(df[str(char)])
    
    print(f"-Check {char} outliers ")

    print('number of outliers: '+ str(len(outliers)))

    print('max outlier value: '+ str(outliers.max()))

    print('min outlier value: '+ str(outliers.min())+ '\n')
-Check Age outliers 
number of outliers: 0
max outlier value: nan
min outlier value: nan

-Check RestingBP outliers 
number of outliers: 28
max outlier value: 200
min outlier value: 0

-Check Cholesterol outliers 
number of outliers: 183
max outlier value: 603
min outlier value: 0

-Check MaxHR outliers 
number of outliers: 2
max outlier value: 63
min outlier value: 60

-Check Oldpeak outliers 
number of outliers: 16
max outlier value: 6.2
min outlier value: -2.6

In [20]:
# Define a function to generate a histogram for a specific column
def generate_histogram(data, column_name):
    plt.figure(figsize=(6, 4))
    sns.histplot(data[column_name], bins=20, kde=True)  # Adjust the number of bins as needed
    
    # Customize the y-axis tick labels
    plt.gca().get_yaxis().get_major_formatter().set_scientific(False)
    
    plt.xlabel(column_name)
    plt.ylabel('Frequency')
    plt.title(f'Histogram of {column_name}')
    plt.show()
In [21]:
# Define a function to generate a box plot for a specific column
def generate_boxplot(data, column_name):
    plt.figure(figsize=(6, 4))
    sns.boxplot(y=data[column_name])
    
    # Customize the y-axis tick labels
    plt.gca().get_yaxis().get_major_formatter().set_scientific(False)
    
    plt.ylabel(column_name)
    plt.title(f'Box Plot of {column_name}')
    plt.show()

Age Column Data Analysis¶

In [22]:
# Generate and display a histogram for the 'Age' column in the DataFrame
generate_histogram(df, 'Age')
# Generate and display a boxplot for the 'Age' column in the DataFrame
generate_boxplot(df, 'Age')
No description has been provided for this image
No description has been provided for this image

Cholesterol Column Data Analysis¶

In [23]:
# Generate and display a histogram for the 'Cholesterol' column in the DataFrame
generate_histogram(df, 'Cholesterol')
# Generate and display a boxplot for the 'Cholesterol' column in the DataFrame
generate_boxplot(df, 'Cholesterol')
No description has been provided for this image
No description has been provided for this image

As per the above diagram, the Cholesterol column contains data that doesn’t seems to be practical. We must exclude those data considering the optimal Cholesterol level to be 60 to 700 .¶

In [24]:
# Checking the number of Zeros present in the Cholesterol
print(f" original shape of Cholesterol : {df.Cholesterol.shape}")

ziro_Cholesterol = df[df['Cholesterol'] == 0]
print(f" zero values of Cholesterol : {ziro_Cholesterol.shape}")

non_ziro_Cholesterol = df[df['Cholesterol'] != 0]
print(f" non zero values of Cholesterol : {non_ziro_Cholesterol.shape}")
 original shape of Cholesterol : (918,)
 zero values of Cholesterol : (172, 12)
 non zero values of Cholesterol : (746, 12)

The cholesterol value cannot be zero. So, zeros must be filled with the median value¶

In [25]:
## Converting Zero Value of Cholesterol to NaN Value
df.loc[df['Cholesterol'] == 0,'Cholesterol'] = np.nan
df.head(5)
Out[25]:
Age Sex ChestPainType RestingBP Cholesterol FastingBS RestingECG MaxHR ExerciseAngina Oldpeak ST_Slope HeartDisease
0 40 1 1 140 289.0 1 1 172 1 0.0 1 2
1 49 2 2 160 180.0 1 1 156 1 1.0 2 1
2 37 1 1 130 283.0 1 2 98 1 0.0 1 2
3 48 2 3 138 214.0 1 1 108 2 1.5 2 1
4 54 1 2 150 195.0 1 1 122 1 0.0 1 2
In [26]:
## NaN value of Cholesterol is filled with median value
df["Cholesterol"] = df["Cholesterol"].fillna(df["Cholesterol"].median())
df["Cholesterol"]
Out[26]:
0      289.0
1      180.0
2      283.0
3      214.0
4      195.0
5      339.0
6      237.0
7      208.0
8      207.0
9      284.0
10     211.0
11     164.0
12     204.0
13     234.0
14     211.0
15     273.0
16     196.0
17     201.0
18     248.0
19     267.0
20     223.0
21     184.0
22     201.0
23     288.0
24     215.0
25     209.0
26     260.0
27     284.0
28     468.0
29     188.0
30     518.0
31     167.0
32     224.0
33     172.0
34     186.0
35     254.0
36     306.0
37     250.0
38     177.0
39     227.0
40     230.0
41     294.0
42     264.0
43     259.0
44     175.0
45     318.0
46     223.0
47     216.0
48     340.0
49     289.0
50     233.0
51     205.0
52     224.0
53     245.0
54     180.0
55     194.0
56     270.0
57     213.0
58     365.0
59     342.0
60     253.0
61     254.0
62     224.0
63     277.0
64     202.0
65     260.0
66     297.0
67     225.0
68     246.0
69     412.0
70     265.0
71     215.0
72     182.0
73     218.0
74     268.0
75     163.0
76     529.0
77     167.0
78     100.0
79     206.0
80     277.0
81     238.0
82     223.0
83     196.0
84     213.0
85     139.0
86     263.0
87     216.0
88     291.0
89     229.0
90     208.0
91     307.0
92     210.0
93     329.0
94     182.0
95     263.0
96     207.0
97     147.0
98      85.0
99     269.0
100    275.0
101    179.0
102    392.0
103    466.0
104    186.0
105    260.0
106    254.0
107    214.0
108    129.0
109    241.0
110    188.0
111    255.0
112    276.0
113    297.0
114    207.0
115    246.0
116    282.0
117    338.0
118    160.0
119    156.0
120    248.0
121    272.0
122    240.0
123    393.0
124    230.0
125    246.0
126    161.0
127    163.0
128    230.0
129    228.0
130    292.0
131    202.0
132    388.0
133    230.0
134    294.0
135    265.0
136    215.0
137    241.0
138    166.0
139    247.0
140    331.0
141    341.0
142    291.0
143    243.0
144    279.0
145    273.0
146    198.0
147    249.0
148    168.0
149    603.0
150    215.0
151    159.0
152    275.0
153    270.0
154    291.0
155    342.0
156    190.0
157    185.0
158    290.0
159    195.0
160    264.0
161    212.0
162    263.0
163    196.0
164    225.0
165    272.0
166    231.0
167    238.0
168    222.0
169    179.0
170    243.0
171    235.0
172    320.0
173    187.0
174    266.0
175    288.0
176    216.0
177    287.0
178    194.0
179    238.0
180    225.0
181    224.0
182    404.0
183    238.0
184    312.0
185    211.0
186    251.0
187    237.0
188    328.0
189    285.0
190    280.0
191    209.0
192    245.0
193    192.0
194    184.0
195    193.0
196    297.0
197    268.0
198    246.0
199    308.0
200    249.0
201    230.0
202    147.0
203    219.0
204    184.0
205    215.0
206    308.0
207    257.0
208    132.0
209    216.0
210    263.0
211    288.0
212    276.0
213    219.0
214    226.0
215    237.0
216    280.0
217    217.0
218    196.0
219    263.0
220    222.0
221    303.0
222    195.0
223    298.0
224    256.0
225    264.0
226    195.0
227    117.0
228    295.0
229    173.0
230    315.0
231    281.0
232    275.0
233    250.0
234    309.0
235    200.0
236    336.0
237    295.0
238    355.0
239    193.0
240    326.0
241    198.0
242    292.0
243    266.0
244    268.0
245    171.0
246    237.0
247    275.0
248    219.0
249    341.0
250    491.0
251    260.0
252    292.0
253    271.0
254    248.0
255    274.0
256    394.0
257    160.0
258    200.0
259    320.0
260    275.0
261    221.0
262    231.0
263    126.0
264    193.0
265    305.0
266    298.0
267    220.0
268    242.0
269    235.0
270    225.0
271    198.0
272    201.0
273    220.0
274    295.0
275    213.0
276    160.0
277    223.0
278    347.0
279    253.0
280    246.0
281    222.0
282    220.0
283    344.0
284    358.0
285    190.0
286    169.0
287    181.0
288    308.0
289    166.0
290    211.0
291    257.0
292    182.0
293    237.0
294    237.0
295    237.0
296    237.0
297    237.0
298    237.0
299    237.0
300    237.0
301    237.0
302    237.0
303    237.0
304    237.0
305    237.0
306    237.0
307    237.0
308    237.0
309    237.0
310    237.0
311    237.0
312    237.0
313    237.0
314    237.0
315    237.0
316    237.0
317    237.0
318    237.0
319    237.0
320    237.0
321    237.0
322    237.0
323    237.0
324    237.0
325    237.0
326    237.0
327    237.0
328    237.0
329    237.0
330    237.0
331    237.0
332    237.0
333    237.0
334    237.0
335    237.0
336    237.0
337    237.0
338    237.0
339    237.0
340    237.0
341    237.0
342    237.0
343    237.0
344    237.0
345    237.0
346    237.0
347    237.0
348    237.0
349    237.0
350    237.0
351    237.0
352    237.0
353    237.0
354    237.0
355    237.0
356    237.0
357    237.0
358    237.0
359    237.0
360    237.0
361    237.0
362    237.0
363    237.0
364    237.0
365    237.0
366    237.0
367    237.0
368    237.0
369    237.0
370    237.0
371    237.0
372    237.0
373    237.0
374    237.0
375    237.0
376    237.0
377    237.0
378    237.0
379    237.0
380    237.0
381    237.0
382    237.0
383    237.0
384    237.0
385    237.0
386    237.0
387    237.0
388    237.0
389    237.0
390    237.0
391    237.0
392    237.0
393    237.0
394    237.0
395    237.0
396    237.0
397    237.0
398    237.0
399    237.0
400    237.0
401    237.0
402    237.0
403    237.0
404    237.0
405    237.0
406    237.0
407    237.0
408    237.0
409    237.0
410    237.0
411    237.0
412    237.0
413    237.0
414    237.0
415    237.0
416    260.0
417    209.0
418    218.0
419    228.0
420    213.0
421    237.0
422    236.0
423    237.0
424    237.0
425    267.0
426    166.0
427    237.0
428    237.0
429    237.0
430    237.0
431    220.0
432    177.0
433    236.0
434    237.0
435    237.0
436    237.0
437    237.0
438    237.0
439    237.0
440    237.0
441    237.0
442    237.0
443    186.0
444    100.0
445    228.0
446    237.0
447    171.0
448    230.0
449    237.0
450    237.0
451    237.0
452    281.0
453    237.0
454    203.0
455    237.0
456    237.0
457    237.0
458    237.0
459    237.0
460    277.0
461    237.0
462    233.0
463    237.0
464    237.0
465    240.0
466    237.0
467    237.0
468    153.0
469    224.0
470    237.0
471    237.0
472    237.0
473    316.0
474    237.0
475    237.0
476    218.0
477    237.0
478    311.0
479    237.0
480    237.0
481    237.0
482    270.0
483    237.0
484    237.0
485    217.0
486    214.0
487    214.0
488    252.0
489    220.0
490    214.0
491    203.0
492    237.0
493    339.0
494    216.0
495    276.0
496    458.0
497    241.0
498    384.0
499    297.0
500    248.0
501    308.0
502    208.0
503    227.0
504    210.0
505    245.0
506    225.0
507    240.0
508    237.0
509    198.0
510    195.0
511    267.0
512    161.0
513    258.0
514    237.0
515    237.0
516    195.0
517    235.0
518    237.0
519    305.0
520    223.0
521    282.0
522    349.0
523    160.0
524    160.0
525    236.0
526    312.0
527    283.0
528    142.0
529    211.0
530    218.0
531    306.0
532    186.0
533    252.0
534    222.0
535    237.0
536    237.0
537    258.0
538    202.0
539    197.0
540    204.0
541    113.0
542    274.0
543    192.0
544    298.0
545    272.0
546    220.0
547    200.0
548    261.0
549    181.0
550    260.0
551    220.0
552    221.0
553    216.0
554    175.0
555    219.0
556    310.0
557    208.0
558    232.0
559    273.0
560    203.0
561    182.0
562    274.0
563    204.0
564    270.0
565    292.0
566    171.0
567    221.0
568    289.0
569    217.0
570    223.0
571    110.0
572    193.0
573    123.0
574    210.0
575    282.0
576    170.0
577    369.0
578    173.0
579    289.0
580    152.0
581    208.0
582    216.0
583    271.0
584    244.0
585    285.0
586    243.0
587    240.0
588    219.0
589    237.0
590    165.0
591    213.0
592    287.0
593    258.0
594    256.0
595    186.0
596    264.0
597    185.0
598    226.0
599    203.0
600    207.0
601    284.0
602    337.0
603    310.0
604    254.0
605    258.0
606    254.0
607    300.0
608    170.0
609    310.0
610    333.0
611    139.0
612    223.0
613    385.0
614    254.0
615    322.0
616    564.0
617    261.0
618    263.0
619    269.0
620    177.0
621    256.0
622    239.0
623    293.0
624    407.0
625    234.0
626    226.0
627    235.0
628    234.0
629    303.0
630    149.0
631    311.0
632    203.0
633    211.0
634    199.0
635    229.0
636    245.0
637    303.0
638    204.0
639    288.0
640    275.0
641    243.0
642    295.0
643    230.0
644    265.0
645    229.0
646    228.0
647    215.0
648    326.0
649    200.0
650    256.0
651    207.0
652    273.0
653    180.0
654    222.0
655    223.0
656    209.0
657    233.0
658    197.0
659    218.0
660    211.0
661    149.0
662    197.0
663    246.0
664    225.0
665    315.0
666    205.0
667    417.0
668    195.0
669    234.0
670    198.0
671    166.0
672    178.0
673    249.0
674    281.0
675    126.0
676    305.0
677    226.0
678    240.0
679    233.0
680    276.0
681    261.0
682    319.0
683    242.0
684    243.0
685    260.0
686    354.0
687    245.0
688    197.0
689    223.0
690    309.0
691    208.0
692    199.0
693    209.0
694    236.0
695    218.0
696    198.0
697    270.0
698    214.0
699    201.0
700    244.0
701    208.0
702    270.0
703    306.0
704    243.0
705    221.0
706    330.0
707    266.0
708    206.0
709    212.0
710    275.0
711    302.0
712    234.0
713    313.0
714    244.0
715    141.0
716    237.0
717    269.0
718    289.0
719    254.0
720    274.0
721    222.0
722    258.0
723    177.0
724    160.0
725    327.0
726    235.0
727    305.0
728    304.0
729    295.0
730    271.0
731    249.0
732    288.0
733    226.0
734    283.0
735    188.0
736    286.0
737    274.0
738    360.0
739    273.0
740    201.0
741    267.0
742    196.0
743    201.0
744    230.0
745    269.0
746    212.0
747    226.0
748    246.0
749    232.0
750    177.0
751    277.0
752    249.0
753    210.0
754    207.0
755    212.0
756    271.0
757    233.0
758    213.0
759    283.0
760    282.0
761    230.0
762    167.0
763    224.0
764    268.0
765    250.0
766    219.0
767    267.0
768    303.0
769    256.0
770    204.0
771    217.0
772    308.0
773    193.0
774    228.0
775    231.0
776    244.0
777    262.0
778    259.0
779    211.0
780    325.0
781    254.0
782    197.0
783    236.0
784    282.0
785    234.0
786    254.0
787    299.0
788    211.0
789    182.0
790    294.0
791    298.0
792    231.0
793    254.0
794    196.0
795    240.0
796    409.0
797    172.0
798    265.0
799    246.0
800    315.0
801    184.0
802    233.0
803    394.0
804    269.0
805    239.0
806    174.0
807    309.0
808    282.0
809    255.0
810    250.0
811    248.0
812    214.0
813    239.0
814    304.0
815    277.0
816    300.0
817    258.0
818    299.0
819    289.0
820    298.0
821    318.0
822    240.0
823    309.0
824    250.0
825    288.0
826    245.0
827    213.0
828    216.0
829    204.0
830    204.0
831    252.0
832    227.0
833    258.0
834    220.0
835    239.0
836    254.0
837    168.0
838    330.0
839    183.0
840    203.0
841    263.0
842    341.0
843    283.0
844    186.0
845    307.0
846    219.0
847    260.0
848    255.0
849    231.0
850    164.0
851    234.0
852    177.0
853    257.0
854    325.0
855    274.0
856    321.0
857    264.0
858    268.0
859    308.0
860    253.0
861    248.0
862    269.0
863    185.0
864    282.0
865    188.0
866    219.0
867    290.0
868    175.0
869    212.0
870    302.0
871    243.0
872    353.0
873    335.0
874    247.0
875    340.0
876    206.0
877    284.0
878    266.0
879    229.0
880    199.0
881    263.0
882    294.0
883    192.0
884    286.0
885    216.0
886    223.0
887    247.0
888    204.0
889    204.0
890    227.0
891    278.0
892    220.0
893    232.0
894    197.0
895    335.0
896    253.0
897    205.0
898    192.0
899    203.0
900    318.0
901    225.0
902    220.0
903    221.0
904    240.0
905    212.0
906    342.0
907    169.0
908    187.0
909    197.0
910    157.0
911    176.0
912    241.0
913    264.0
914    193.0
915    131.0
916    236.0
917    175.0
Name: Cholesterol, dtype: float64
In [27]:
df = df[(df['Cholesterol'] >= 60) & (df['Cholesterol'] <= 700)]

df.shape
Out[27]:
(918, 12)
In [28]:
# Regenerate and display a histogram for the 'Cholesterol' column in the DataFrame
generate_histogram(df, 'Cholesterol')
# Regenerate and display a boxplot for the 'Cholesterol' column in the DataFrame
generate_boxplot(df, 'Cholesterol')
No description has been provided for this image
No description has been provided for this image

Resting Blood Pressure Column Data Analysis¶

In [29]:
# Regenerate and display a histogram for the 'RestingBP' column in the DataFrame
generate_histogram(df, 'RestingBP')
# Regenerate and display a boxplot for the 'RestingBP' column in the DataFrame
generate_boxplot(df, 'RestingBP')
No description has been provided for this image
No description has been provided for this image

Based on the histogram and boxplot, it appears that RestingBP (Resting Blood Pressure) should not contain zero values. Let’s identify and remove any rows where RestingBP is zero, as such values likely represent errors or missing data¶

In [30]:
#Checking the smallest and largest RestingBP values in dataset
print(f"smallest values :\n{df.RestingBP.nsmallest(3)}")
print(f"largest values :\n{df.RestingBP.nlargest(3)}")
smallest values :
449     0
314    80
227    92
Name: RestingBP, dtype: int64
largest values :
241    200
365    200
399    200
Name: RestingBP, dtype: int64
In [31]:
#Normally Blood Pressure can not be zero value , but in this dataset we have 1 sample
ziro_RestingBP = df[df['RestingBP'] == 0]
ziro_RestingBP
Out[31]:
Age Sex ChestPainType RestingBP Cholesterol FastingBS RestingECG MaxHR ExerciseAngina Oldpeak ST_Slope HeartDisease
449 55 1 2 0 237.0 1 1 155 1 1.5 2 1
In [32]:
#We should remove this row 
df = df.drop(df[(df['RestingBP'] == 0)].index) 
In [33]:
# Regenerate and display histogram and boxplot for the 'RestingBP' column in the DataFrame
generate_histogram(df, 'RestingBP')
generate_boxplot(df, 'RestingBP')
No description has been provided for this image
No description has been provided for this image

Oldpeak Column Data Analysis¶

In [34]:
# Generate and display histogram and boxplot for the 'Oldpeak' column in the DataFrame
generate_histogram(df, 'Oldpeak')
generate_boxplot(df, 'Oldpeak')
No description has been provided for this image
No description has been provided for this image
In [35]:
#Checking the smallest and largest Oldpeak values in dataset
print(f"smallest values :\n{df.Oldpeak.nsmallest(3)}")
print(f"largest values :\n{df.Oldpeak.nlargest(3)}")
smallest values :
324   -2.6
413   -2.0
325   -1.5
Name: Oldpeak, dtype: float64
largest values :
850    6.2
771    5.6
166    5.0
Name: Oldpeak, dtype: float64
In [36]:
#According to the Oldpeak value range we haven`t minus value , but in this dataset we have 13 samples
ziro_Oldpeak = df[df['Oldpeak'] < 0]
ziro_Oldpeak
Out[36]:
Age Sex ChestPainType RestingBP Cholesterol FastingBS RestingECG MaxHR ExerciseAngina Oldpeak ST_Slope HeartDisease
321 63 1 3 100 237.0 2 1 109 1 -0.9 2 1
324 46 1 3 100 237.0 2 2 133 1 -2.6 2 1
325 42 1 3 105 237.0 2 1 128 2 -1.5 3 1
326 45 1 2 110 237.0 1 1 138 1 -0.1 1 2
331 56 1 3 115 237.0 2 2 82 1 -1.0 1 1
332 38 1 2 100 237.0 1 1 179 1 -1.1 1 2
334 51 1 3 130 237.0 2 1 170 1 -0.7 1 1
335 62 1 4 120 237.0 2 3 134 1 -0.8 2 1
352 56 1 3 120 237.0 1 2 100 2 -1.0 3 1
407 62 1 3 115 237.0 2 1 72 2 -0.5 2 1
413 56 1 2 125 237.0 2 1 98 1 -2.0 2 1
421 66 1 2 120 237.0 1 2 120 1 -0.5 1 2
512 35 1 2 123 161.0 1 2 153 1 -0.1 1 2
In [37]:
#We should remove those rows 
df = df.drop(df[(df['Oldpeak'] < 0)].index)
In [38]:
# Regenerate and display histogram and boxplot for the 'Oldpeak' column in the DataFrame
generate_histogram(df, 'Oldpeak')
generate_boxplot(df, 'Oldpeak')
No description has been provided for this image
No description has been provided for this image

MaxHR Column Data Analysis¶

In [39]:
# Generate and display histogram and boxplot for the 'MaxHR' column in the DataFrame
generate_histogram(df, 'MaxHR')
generate_boxplot(df, 'MaxHR')
No description has been provided for this image
No description has been provided for this image

Unique and Nununique value:¶

In [40]:
#Showing the unique and nununique values
df.nunique()
Out[40]:
Age                50
Sex                 2
ChestPainType       4
RestingBP          66
Cholesterol       221
FastingBS           2
RestingECG          3
MaxHR             119
ExerciseAngina      2
Oldpeak            43
ST_Slope            3
HeartDisease        2
dtype: int64
In [41]:
#Below the red horizontal line ,all features are contain categorical data
df.nunique().plot(kind='bar')
plt.title('No of unique values in the dataset')
plt.hlines(y=6, xmin=-2, xmax=15, color='red')
plt.show()
No description has been provided for this image
In [42]:
for i in range(0,7):
    print(f"\nShow the unique value of {df_cat_name[i]} column : {pd.unique(df[df_cat_name[i]])}\n")  
Show the unique value of Sex column : [1 2]


Show the unique value of ChestPainType column : [1 2 3 4]


Show the unique value of FastingBS column : [1 2]


Show the unique value of RestingECG column : [1 2 3]


Show the unique value of ExerciseAngina column : [1 2]


Show the unique value of ST_Slope column : [1 2 3]


Show the unique value of HeartDisease column : [2 1]

In [43]:
i = 0
while i < 7 :
    if i < 6 :
        plt.figure(figsize=(8,5))
        plt.subplot(1, 3, 1)
        sns.countplot(x=df_cat_name[i] , data=df, hue=df_cat_name[i], palette="deep", legend=False)
        plt.xlabel(str(df_cat_name[i]))
        i+=1

        plt.subplot(1, 3, 2)
        sns.countplot(x=df_cat_name[i] , data=df, hue=df_cat_name[i], palette="deep", legend=False)
        plt.xlabel(str(df_cat_name[i]))
        i+=1
    
        plt.subplot(1, 3, 3)
        sns.countplot(x=df_cat_name[i] , data=df, hue=df_cat_name[i], palette="deep", legend=False)
        plt.xlabel(str(df_cat_name[i]))
        i+=1
    elif i == 6 :
        plt.figure(figsize=(2.4,5))
        plt.subplot(1, 1, 1)
        sns.countplot(x=df_cat_name[i] , data=df, hue=df_cat_name[i], palette="deep", legend=False)
        plt.xlabel(str(df_cat_name[i]))
        i+=1   
        
        plt.subplots_adjust(left=0.1,
                    bottom=0.1, 
                    right=0.9, 
                    top=0.9, 
                    wspace=0.4, 
                    hspace=0.4)
    
        plt.show()
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image

Pie Chart¶

In [44]:
#Count of unique value in each feature
for c in range(6) :
    print(f"\nCount of {df_cat_name[c]} :\n{df[df_cat_name[c]].value_counts()}\n\n------------")
Count of Sex :
Sex
1    711
2    193
Name: count, dtype: int64

------------

Count of ChestPainType :
ChestPainType
3    489
2    197
1    173
4     45
Name: count, dtype: int64

------------

Count of FastingBS :
FastingBS
1    698
2    206
Name: count, dtype: int64

------------

Count of RestingECG :
RestingECG
1    544
3    187
2    173
Name: count, dtype: int64

------------

Count of ExerciseAngina :
ExerciseAngina
1    536
2    368
Name: count, dtype: int64

------------

Count of ST_Slope :
ST_Slope
2    454
1    389
3     61
Name: count, dtype: int64

------------
In [45]:
# Define labels and sizes for the 'Sex' category in the pie chart
sex_label = ['Male','Female']
sex_size = [725,193]
sex_explode = (0,0)
# Set up the figure for the pie chart
plt.figure(figsize=(8,5),facecolor='lightgray')
# Create a pie chart with the provided data
plt.pie( sex_size , explode=sex_explode , labels=sex_label ,shadow=True ,
        autopct='%1.2f%%' , startangle=90 , colors=['lime','crimson'])
plt.title("Count of Sex",fontsize=25,color='maroon')
plt.legend()
Out[45]:
<matplotlib.legend.Legend at 0x1d6d6001010>
No description has been provided for this image
In [46]:
# Define labels and sizes for the 'FastingBS' category in the pie chart
FastingBS_label = ['1: if FBS>120','0: otherwise']
FastingBS_size = [704,214]
FastingBS_explode = (0,0)

# Set up the figure for the pie chart
plt.figure(figsize=(8,5),facecolor='lightgray')
# Create a pie chart with the provided data
plt.pie( FastingBS_size , explode=FastingBS_explode , labels=FastingBS_label ,shadow=True ,
        autopct='%1.2f%%' , startangle=90 , colors=['lime','crimson'])
plt.title("Count of FastingBS",fontsize=25,color='maroon')
plt.legend()
Out[46]:
<matplotlib.legend.Legend at 0x1d6d5fb1010>
No description has been provided for this image
In [47]:
# Define labels and sizes for the 'ChestPainType' category in the pie chart
ChestPainType_label = ['ATA', 'NAP', 'ASY', 'TA']
ChestPainType_size = [173, 203, 496, 46]
ChestPainType_explode = (0, 0, 0, 0)
# Set up the figure for the pie chart
plt.figure(figsize=(8,6),facecolor='lightgray')
# Create a pie chart with the provided data
plt.pie( ChestPainType_size , explode=ChestPainType_explode , labels=ChestPainType_label ,shadow=True ,
        autopct='%1.2f%%' , startangle=90, colors= ['lime','crimson', 'slateblue', 'deeppink'])
plt.title("count of ChestPainType",fontsize=25,color='maroon')
plt.legend()
Out[47]:
<matplotlib.legend.Legend at 0x1d6d61d7fe0>
No description has been provided for this image
In [48]:
# Define labels and sizes for the 'RestingECG' category in the pie chart
RestingECG_label = ['Normal', 'ST', 'LVH']
RestingECG_size = [552, 178, 188]
RestingECG_explode = (0, 0, 0)
# Set up the figure for the pie chart
plt.figure(figsize=(8, 5),facecolor='lightgray')
# Create a pie chart with the provided data
plt.pie( RestingECG_size , explode=RestingECG_explode , labels=RestingECG_label ,shadow=True ,
        autopct='%1.2f%%' , startangle=90, colors=['lime', 'crimson', 'slateblue'])
plt.title("count of RestingECG",fontsize=25,color='maroon')
plt.legend()
Out[48]:
<matplotlib.legend.Legend at 0x1d6d9ae9010>
No description has been provided for this image
In [49]:
# Define labels and sizes for the 'ExerciseAngina' category in the pie chart
ExerciseAngina_label = ['Yes', 'No']
ExerciseAngina_size = [547, 371]
ExerciseAngina_explode = (0, 0)
# Set up the figure for the pie chart
plt.figure(figsize=(8, 5),facecolor='lightgray')
# Create a pie chart with the provided data
plt.pie( ExerciseAngina_size , explode=ExerciseAngina_explode , labels=ExerciseAngina_label ,shadow=True ,
        autopct='%1.2f%%' , startangle=90, colors=['lime', 'crimson'])
plt.title("count of ExerciseAngina",fontsize=25,color='maroon')
plt.legend()
Out[49]:
<matplotlib.legend.Legend at 0x1d6d870a7b0>
No description has been provided for this image

Catplot¶

In [50]:
for i in range(0,7) :
    if i < 6 :
         # Set up a new figure for the count plot with specified dimensions
        plt.figure(figsize=(3,4))
         # Create a categorical count plot using seaborn
        # 'HeartDisease' is plotted on the x-axis, and the hue is determined by the category defined in df_cat_name[i]
        sns.catplot(x="HeartDisease", hue=df_cat_name[i], kind="count",palette="pastel", edgecolor=".9",data=df)
        plt.show()
    elif i==6 :
        pass
<Figure size 300x400 with 0 Axes>
No description has been provided for this image
<Figure size 300x400 with 0 Axes>
No description has been provided for this image
<Figure size 300x400 with 0 Axes>
No description has been provided for this image
<Figure size 300x400 with 0 Axes>
No description has been provided for this image
<Figure size 300x400 with 0 Axes>
No description has been provided for this image
<Figure size 300x400 with 0 Axes>
No description has been provided for this image

Visualising numerical Data¶

In [51]:
# Set up a new figure for the count plot with specified dimensions
plt.figure(figsize=(10,5))
# Define bins for categorizing ages into intervals
bins=[0, 20, 40, 60, 80]
# Create a count plot using seaborn
# The x-axis represents age categories defined by the bins, and the hue represents the presence of heart disease
sns.countplot(x=pd.cut(df.Age,bins=bins),hue=df.HeartDisease)
plt.title("HeartDisease by Age", fontsize=15)
plt.show()
No description has been provided for this image
In [52]:
# Create a horizontal count plot using seaborn
# The y-axis represents the 'Sex' variable, and the hue distinguishes between those with and without heart disease
ax = sns.countplot(y="Sex", hue="HeartDisease", data=df)
No description has been provided for this image

Box Plot¶

In [53]:
# Set up the subplots grid
from plotly.subplots import make_subplots
fig = make_subplots(rows=2, cols=3, 
                    # Set the subplot titles
                    subplot_titles=['Age', 'RestingBP', 'Cholesterol','MaxHR','Oldpeak'])
#create boxplot visualization of numeric columns
fig.add_trace(go.Box(x=df.Age, name='', showlegend=False), row=1, col=1)
fig.add_trace(go.Box(x=df.RestingBP, name='', showlegend=False), row=1, col=2)
fig.add_trace(go.Box(x=df.Cholesterol, name='', showlegend=False), row=1, col=3)
fig.add_trace(go.Box(x=df.MaxHR, name='', showlegend=False), row=2, col=1)
fig.add_trace(go.Box(x=df.Oldpeak, name='', showlegend=False), row=2, col=2)

#config size
fig.update_layout(height=500, width=1100)
#show visualizations
fig.show()

Correlation¶

In [54]:
#Correlation between all features 
fig , ax = plt.subplots(figsize=(13,6))   
sns.heatmap(df.corr(), cmap="coolwarm", linecolor='white' , annot=True , linewidths=1 , ax=ax )
Out[54]:
<Axes: >
No description has been provided for this image
In [55]:
# Calculate the absolute correlation coefficients between all numerical columns and 'HeartDisease'
pd.DataFrame(abs(df.corr()['HeartDisease'])).T.round(2)
Out[55]:
Age Sex ChestPainType RestingBP Cholesterol FastingBS RestingECG MaxHR ExerciseAngina Oldpeak ST_Slope HeartDisease
HeartDisease 0.28 0.31 0.46 0.12 0.08 0.26 0.06 0.4 0.5 0.43 0.56 1.0
In [56]:
## Combining Data
df.agg(
    {
       "Age": ["min", "max", "median","mean", "skew", 'std'],
        "RestingBP": ["min", "max", "median", "mean","skew",'std'],
        "Cholesterol": ["min", "max", "median", "mean","skew",'std'],
        "Oldpeak": ["min", "max", "median", "mean","skew",'std'],
        "MaxHR": ["min", "max", "median", "mean","skew",'std']
    }
)
Out[56]:
Age RestingBP Cholesterol Oldpeak MaxHR
min 28.000000 80.000000 85.000000 0.000000 60.000000
max 77.000000 200.000000 603.000000 6.200000 202.000000
median 54.000000 130.000000 237.000000 0.600000 138.000000
mean 53.528761 132.806416 243.384956 0.913606 136.969027
skew -0.193384 0.605859 1.435895 1.140450 -0.136971
std 9.431648 17.952414 53.738632 1.047342 25.337263

Data Train and Test¶

In [57]:
x = df.drop('HeartDisease', axis=1)
y = df.HeartDisease
In [58]:
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=21)

Feature Scaling with Normalization method¶

In [59]:
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
x_train = scaler.fit_transform(x_train) 
x_test = scaler.fit_transform(x_test)
In [60]:
x_train = pd.DataFrame(x_train, columns=x.columns)
x_test = pd.DataFrame(x_test, columns=x.columns)
In [61]:
print("x train : \n")
print(x_train.head())
print("x test : \n")
print(x_test.head())
x train : 

        Age  Sex  ChestPainType  RestingBP  Cholesterol  FastingBS  \
0  0.428571  0.0       0.666667   0.500000     0.311065        0.0   
1  0.224490  0.0       0.000000   0.333333     0.248434        0.0   
2  0.714286  0.0       0.666667   0.500000     0.365344        0.0   
3  0.530612  0.0       0.666667   1.000000     0.235908        0.0   
4  0.530612  0.0       0.000000   0.933333     0.413361        0.0   

   RestingECG     MaxHR  ExerciseAngina   Oldpeak  ST_Slope  
0         0.0  0.553957             1.0  0.161290       0.5  
1         0.0  0.589928             0.0  0.000000       0.0  
2         0.5  0.352518             1.0  0.483871       0.5  
3         0.0  0.568345             1.0  0.322581       0.5  
4         1.0  0.949640             0.0  0.000000       0.0  
x test : 

        Age  Sex  ChestPainType  RestingBP  Cholesterol  FastingBS  \
0  0.416667  0.0       0.666667   0.361702     0.210736        0.0   
1  0.479167  0.0       0.666667   0.361702     0.248509        0.0   
2  0.250000  0.0       0.666667   0.255319     0.272366        1.0   
3  0.500000  0.0       0.000000   0.255319     0.161034        0.0   
4  0.354167  0.0       0.666667   0.148936     0.202783        0.0   

   RestingECG     MaxHR  ExerciseAngina  Oldpeak  ST_Slope  
0         0.0  0.833333             0.0      0.0       0.5  
1         0.0  0.454545             1.0      0.4       0.5  
2         0.0  0.590909             1.0      0.2       0.5  
3         0.0  0.545455             0.0      0.0       0.0  
4         0.0  0.681818             1.0      0.0       0.5  

Modeling¶

In [62]:
#Spliting data in to training and testing sets 
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=34)

Logistic Regresssion¶

In [63]:
#Metrics
from sklearn import metrics
from sklearn.metrics import classification_report, confusion_matrix, f1_score, accuracy_score
In [64]:
from sklearn.linear_model import LogisticRegression
In [65]:
# Create and train a Logistic Regression model
LR_model = LogisticRegression(max_iter=1000)
LR_model.fit(x_train, y_train)
Out[65]:
LogisticRegression(max_iter=1000)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
LogisticRegression(max_iter=1000)
In [66]:
# Make predictions on the test set
LR_y_pred = LR_model.predict(x_test)
In [67]:
LR_train_preds = LR_model.predict(x_train)
LR_train_preds
Out[67]:
array([1, 1, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 2, 2,
       1, 2, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 2, 1, 2,
       2, 2, 1, 2, 2, 2, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1,
       2, 1, 1, 1, 2, 1, 2, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 1, 2, 1,
       1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 2, 1, 1, 1, 1,
       2, 1, 1, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 2, 2, 2,
       1, 1, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 1, 2, 2, 1, 2, 2, 2,
       2, 1, 1, 1, 2, 2, 1, 1, 1, 2, 1, 2, 1, 1, 2, 2, 2, 1, 2, 1, 1, 1,
       2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 2, 2, 1,
       2, 2, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 2, 2, 2, 1,
       2, 1, 2, 1, 2, 1, 2, 2, 1, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 2,
       2, 1, 2, 2, 2, 1, 2, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 1, 2,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 2, 1, 1, 2, 2, 2, 1, 2, 2,
       2, 2, 1, 2, 1, 2, 1, 1, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1,
       2, 2, 2, 2, 1, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 2,
       1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 2, 2, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1,
       1, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 2, 1, 1, 1, 2, 2, 1, 2,
       1, 1, 2, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
       2, 2, 2, 1, 2, 2, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 2, 2, 2, 1,
       2, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 2, 2, 2, 1, 1, 1,
       2, 2, 1, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1, 1, 1,
       2, 1, 1, 1, 2, 1, 1, 1, 2, 2, 2, 2, 1, 2, 1, 1, 1, 1, 2, 2, 2, 1,
       2, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1,
       1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 2, 2, 1, 2, 1, 2, 2, 2, 1, 1,
       1, 1, 1, 2, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 1, 1, 2, 2, 2, 1, 2,
       1, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2,
       1, 2, 1, 1, 1, 2, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 2, 1, 2,
       2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 1, 1, 2, 1, 1, 2, 1,
       1, 1, 2, 2, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1], dtype=int64)
In [68]:
LR_test_preds = LR_model.predict(x_test)
LR_test_preds
Out[68]:
array([1, 2, 2, 1, 2, 2, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1, 1, 2, 2, 2,
       2, 2, 1, 1, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 2,
       1, 1, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 1, 2, 1, 1,
       1, 1, 2, 2, 2, 2, 2, 1, 1, 2, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 2,
       2, 1, 1, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 2, 2,
       1, 2, 1, 1, 1, 1, 2, 2, 1, 2, 1, 1, 1, 2, 2, 2, 2, 1, 2, 1, 2, 2,
       2, 2, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 2, 1, 1, 1, 2, 2, 1, 2,
       2, 2, 1, 1, 2, 2, 2, 1, 2, 2, 2, 1, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1,
       1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1,
       1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 2,
       2, 2, 2, 1, 1, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 2, 2, 1, 1, 1,
       2, 1, 2, 2, 1, 1, 1, 2, 1, 2, 2, 1, 1, 2, 2, 2, 2, 2, 1, 1, 2, 2,
       1, 2, 1, 2, 2, 2, 2, 1], dtype=int64)
In [69]:
LR_train_preds_score = LR_model.score(x_train,y_train)
LR_train_preds_score
Out[69]:
0.8465189873417721
In [70]:
LR_test_preds_score = LR_model.score(x_test,y_test)
LR_test_preds_score
Out[70]:
0.8639705882352942
In [71]:
# Compute the confusion matrix
conf_matrix = confusion_matrix(y_test, LR_y_pred)
In [72]:
# Create a DataFrame for the confusion matrix (optional)
confusion_df = pd.DataFrame(conf_matrix, index=LR_model.classes_, columns=LR_model.classes_)
In [73]:
# Create a heatmap to visualize the confusion matrix
plt.figure(figsize=(8, 6))
sns.heatmap(confusion_df, annot=True, fmt='d', cmap='Blues', linewidths=.5, cbar=False)
plt.xlabel('Predicted')
plt.ylabel('Actual')
plt.title('Confusion Matrix')
plt.show()
No description has been provided for this image
In [74]:
# Evaluate the model
accuracy = accuracy_score(y_test, LR_y_pred)
classification_rep = classification_report(y_test, LR_y_pred)
confusion_mat = confusion_matrix(y_test, LR_y_pred)
In [75]:
# Print the results
print(f"Accuracy: {accuracy}")
print("Classification Report:\n", classification_rep)
print("Confusion Matrix:\n", confusion_mat)
Accuracy: 0.8639705882352942
Classification Report:
               precision    recall  f1-score   support

           1       0.88      0.86      0.87       147
           2       0.84      0.86      0.85       125

    accuracy                           0.86       272
   macro avg       0.86      0.86      0.86       272
weighted avg       0.86      0.86      0.86       272

Confusion Matrix:
 [[127  20]
 [ 17 108]]

Random Forest¶

In [76]:
# Create and train a Random Forest Classifier model
RFC_model = RandomForestClassifier()
RFC_model.fit(x_train, y_train)
Out[76]:
RandomForestClassifier()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
RandomForestClassifier()
In [77]:
# Make predictions on the test set
RFC_y_pred =RFC_model.predict(x_test)
In [78]:
RFC_train_preds = RFC_model.predict(x_train)
RFC_train_preds
Out[78]:
array([2, 1, 1, 1, 2, 2, 1, 1, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 1, 2, 2, 1,
       1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 2, 1, 2, 2, 1, 1, 2, 2, 1, 1,
       1, 2, 1, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 2,
       2, 1, 1, 1, 2, 1, 2, 1, 1, 1, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 1,
       1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 2, 1, 1, 1, 1,
       2, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 2, 2, 2,
       1, 1, 1, 1, 2, 1, 2, 2, 2, 1, 2, 1, 2, 2, 1, 1, 2, 2, 1, 2, 2, 2,
       2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2,
       2, 1, 2, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 2, 1, 1,
       2, 2, 1, 1, 2, 2, 2, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 2, 2, 1, 1,
       2, 1, 2, 1, 2, 1, 2, 1, 1, 1, 2, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 2,
       2, 1, 2, 2, 2, 1, 2, 1, 2, 2, 1, 2, 1, 1, 1, 1, 1, 1, 2, 2, 1, 2,
       1, 1, 2, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 2, 1, 1, 1, 2, 2, 1, 2, 1,
       1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 2, 2, 1, 2, 1, 1, 1, 2, 1, 1, 1, 1,
       2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 1, 1, 2, 1, 1, 2,
       2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1,
       2, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 2, 1, 2, 2, 1, 1, 1, 2, 2, 1, 2,
       1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2,
       2, 2, 2, 1, 2, 2, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 2, 1,
       1, 1, 2, 1, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 2, 2, 2, 2, 1,
       1, 2, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1, 1, 1,
       2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2,
       2, 1, 1, 1, 1, 2, 1, 1, 2, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1,
       1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 2, 2, 2, 2, 1, 1, 1, 2, 2, 1, 1, 1,
       1, 1, 1, 2, 2, 1, 2, 1, 2, 1, 1, 2, 2, 1, 1, 1, 1, 2, 2, 1, 1, 1,
       1, 2, 1, 2, 2, 1, 1, 1, 2, 2, 2, 1, 1, 2, 1, 1, 1, 2, 2, 2, 1, 2,
       1, 2, 1, 1, 1, 2, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 1, 2, 2, 2, 1, 2,
       2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 1, 1, 2, 1, 1, 2, 1,
       1, 1, 2, 2, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1], dtype=int64)
In [79]:
RFC_test_preds = RFC_model.predict(x_test)
RFC_test_preds
Out[79]:
array([1, 2, 2, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 2,
       2, 2, 1, 1, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 2, 2,
       1, 1, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1,
       1, 1, 2, 2, 2, 2, 2, 1, 1, 2, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 2,
       2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 2, 1, 2, 1, 1, 2, 2, 2, 1, 1, 2, 2,
       1, 2, 1, 1, 1, 1, 2, 2, 1, 2, 1, 1, 1, 2, 2, 2, 2, 1, 2, 1, 2, 1,
       1, 2, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 2, 2, 1, 2,
       2, 1, 1, 1, 2, 2, 2, 1, 1, 2, 2, 1, 1, 1, 2, 2, 2, 2, 1, 1, 2, 1,
       1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1,
       1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
       2, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 1,
       2, 2, 2, 2, 1, 1, 1, 2, 1, 2, 2, 1, 1, 2, 2, 2, 2, 1, 1, 1, 2, 2,
       1, 2, 1, 2, 2, 2, 2, 1], dtype=int64)
In [80]:
RFC_train_preds_score = RFC_model.score(x_train,y_train)
RFC_train_preds_score
Out[80]:
1.0
In [81]:
RFC_test_preds_score = RFC_model.score(x_test,y_test)
RFC_test_preds_score
Out[81]:
0.8602941176470589
In [82]:
# Compute the confusion matrix
conf_matrix_rfc = confusion_matrix(y_test, RFC_y_pred)
In [83]:
# Create a DataFrame for the confusion matrix (optional)
confusion_df_rfc = pd.DataFrame(conf_matrix_rfc, index=RFC_model.classes_, columns=RFC_model.classes_)
In [84]:
# Create a heatmap to visualize the confusion matrix
plt.figure(figsize=(8, 6))
sns.heatmap(confusion_df_rfc, annot=True, fmt='d', cmap='Blues', linewidths=.5, cbar=False)
plt.xlabel('Predicted')
plt.ylabel('Actual')
plt.title('Confusion Matrix')
plt.show()
No description has been provided for this image
In [85]:
# Evaluate the model
accuracy_rfc = accuracy_score(y_test, RFC_y_pred)
classification_rep_rfc = classification_report(y_test, RFC_y_pred)
confusion_mat_rfc = confusion_matrix(y_test, RFC_y_pred)
In [87]:
# Print the results
print(f"Accuracy: {accuracy_rfc}")
print("Classification Report:\n", classification_rep_rfc)
print("Confusion Matrix:\n", confusion_mat_rfc)
Accuracy: 0.8602941176470589
Classification Report:
               precision    recall  f1-score   support

           1       0.85      0.90      0.87       147
           2       0.87      0.82      0.84       125

    accuracy                           0.86       272
   macro avg       0.86      0.86      0.86       272
weighted avg       0.86      0.86      0.86       272

Confusion Matrix:
 [[132  15]
 [ 23 102]]
In [ ]: